RocketMQ的消费流程和最佳实践—消费者概述

消费者概述

消费者一般指获取消息、转发消息给业务代码处理的一系列代码实现。在 RocketMQ中,消费行为是如何进行的呢?本节将详细讲述。

3.1.1 消费流程

RocketMQ消费者支持订阅发布模式和Queue模式。下面以集群模式消费为例,描述生产、消费是如何进行的。

先来看一下图3-1中与消费者相关的名词:

消费者组:一个逻辑概念,在使用消费者时需要指定一个组名。一个消费者组可以订阅多个Topic。

消费者实例:一个消费者组程序部署了多个进程,每个进程都可以称为一个消费者实例。

订阅关系:一个消费者组订阅一个 Topic 的某一个 Tag,这种记录被称为订阅关系。RocketMQ规定消费订阅关系(消费者组名-Topic-Tag)必须一致——在此,笔者想提醒读者,一定要重视这个问题,一个消费者组中的实例订阅的Topic和Tag必须完全一致,否则就是订阅关系不一致。订阅关系不一致会导致消费消息紊乱。

3.1.2 消费模式

RocketMQ目前支持集群消费模式和广播消费模式,其中集群消费模式使用最为广泛。

1.集群消费模式

在同一个消费者组中的消费者实例,是负载均衡(策略可以配置)地消费Topic中的消息,假如有一个生产者(Producer)发送了 120 条消息,其所属的 Topic 有 3 个消费者(Consumer)组,每个消费者组设置为集群消费,分别有2个消费者实例。

Consumer Group 1的两个实例127.0.0.1和127.0.0.2分别负载均衡地消费60条消息。由此我们可以得出使用负载均衡策略时,每个消费者实例消费消息数=生产消息数/消费者实例数,在本例中是60=120/2。

目前大部分场景都适合集群消费模式,RocketMQ 的消费模式默认是集群消费。比如异步通信、削峰等对消息没有顺序要求的场景都适合集群消费。因为集群模式的消费进度是保存在Broker端的,所以即使应用崩溃,消费进度也不会出错。

2.广播消费模式

广播消费,顾名思义全部的消息都是广播分发,即消费者组中的全部消费者实例将消费整个 Topic 的全部消息。比如,有一个生产者生产了 120 条消息,其所属的 Topic 有 3个消费者组,每个消费者组设置为广播消费,分别有两个消费者实例。

Consumer Group 1中的消费者127.0.0.1和消费者127.0.0.2分别消费120条消息。整个消费者组收到消息120×2=240条。由此我们可以得出广播消费时,每个消费者实例的消费消息数=生产者生产的消息数,整个消费者组中所有实例消费消息数=每个消费者实例消费消息数×消费者实例数,本例中是240=120×2。

广播消费比较适合各个消费者实例都需要通知的场景,比如刷新应用服务器中的缓存,如图3-4所示。

生产者发一个刷新缓存的广播消息,消费者组如果设置为广播消费,那么每个应用服务中的消费者都可以消费这个消息,也都能刷新缓存。

广播消费的消费进度保存在客户端机器的文件中。如果文件弄丢了,那么消费进度就丢失了,可能会导致部分消息没有消费。

3.1.3 可靠消费

RocketMQ是一种十分可靠的消息队列中间件,消费侧通过重试-死信机制、Rebalance机制等多种机制保证消费的可靠性。

1.重试-死信机制

我们假设有一个场景,在消费消息时由于网络不稳定导致一条消息消费失败。此时是让生产者重新手动发消息呢,还是自己做数据补偿?RocketMQ 告诉你,消费不是一锤子买卖。

横向看,RocketMQ的消费过程分为 3个阶段:正常消费、重试消费和死信。在引进了正常Topic、重试队列、死信队列后,消费过程的可靠性提高了。RocketMQ的消费流程如图3-5所示。

正常Topic:正常消费者订阅的Topic名字。

重试 Topic:如果由于各种意外导致消息消费失败,那么该消息会自动被保存到重试Topic中,格式为“%RETRY%消费者组”,在订阅的时候会自动订阅这个重试Topic。

进入重试队列的消息有16次重试机会,每次都会按照一定的时间间隔进行,如表3-1所示。RocketMQ 认为消费不是一锤子买卖,可能由于各种偶然因素导致正常消费失败,只要正常消费或者重试消费中有一次消费成功,就算消费成功。

死信Topic:死信Topic名字格式为“%DLQ%消费者组名”。如果正常消费1次失败,重试16次失败,那么消息会被保存到死信Topic中,进入死信Topic的消息不能被再次消费。RocketMQ认为,如果17次机会都失败了,说明生产者发送消息的格式发生了变化,或者消费服务出现了问题,需要人工介入处理。

彩蛋:如果有一天你的数据消费失败,发现是因为消费代码有bug,修复后再上线,想补偿之前消费失败的死信数据,怎么办呢?

2.Rebalance机制

Rebalance(重平衡)机制,用于在发生Broker掉线、Topic扩容和缩容、消费者扩容和缩容等变化时,自动感知并调整自身消费,以尽量减少甚至避免消息没有被消费。后面会详细讲述Rebalance的过程。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ 是一个开源的分布式消息中间件,它的消费流程如下: 1. 创建消费者:首先,你需要创建一个消费者实例,用于接收并处理消息。你需要指定消费者所属的消费者(Consumer Group),这样可以实现负载均衡和容错。 2. 订阅主题:在创建消费者后,你需要订阅一个或多个主题(Topic),以便接收该主题下的消息。订阅可以使用通配符匹配多个主题。 3. 拉取消息:一旦订阅了主题,消费者就可以从消息队列中拉取消息。RocketMQ 提供了两种拉取方式:拉取模式和推动模式。在拉取模式下,消费者主动拉取消息;在推动模式下,消息服务器将消息推送给消费者。 4. 消息过滤:你可以使用消息过滤器对接收到的消息进行过滤。消息过滤器可以基于消息的属性、标签等进行条件过滤。 5. 消息处理:一旦消费者接收到消息,就可以进行相应的处理逻辑。你可以根据业务需求进行自定义的消息处理操作。 6. 消息确认:在消息处理完成后,消费者需要向消息服务器发送消息确认(ACK),以告知服务器该消息已经被成功消费。消息服务器将根据 ACK 的反馈情况进行消息的删除或重试。 7. 顺序消费:如果你需要保证消息的顺序消费RocketMQ 提供了顺序消费的机制。你可以通过指定消息队列的顺序消费模式来实现按顺序消费消息。 总结起来,RocketMQ消费流程包括创建消费者、订阅主题、拉取消息、消息过滤、消息处理和消息确认等步骤。这些步骤可以根据业务需求进行灵活配置和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值