RocketMQ知识盘点【叁】_Consumer

前文回顾:

RocketMQ知识盘点【壹】_Producer和NameServer

RocketMQ知识盘点【贰】_Broker和消息存储

 

1.模式

1.1 模式类型

分为推模式和拉模式。

推模式是broker向consumer注册一个listener接口,收到消息后会回调listener接口,采用长轮询方式实现push;

拉模式是consumer主动向broker拉消息,下文介绍。本质上,推模式是在拉模式上包装了一层,一个拉取任务完成后开始下一个拉取任务。

简短截说,拉模式下consumer端会使用PullMessageService(本质是一个线程),不断构造PullRequest到pullRequestQueue,经历负载均衡向broker发送拉取消息请求。每次默认拉取32个消息,存放到ProcessQueue中,当消息消费成功再从中移除。默认情况消息超过15分钟未消费成功,则延迟3个延迟级别进行重试。

推模式是基于拉模式实现的,在于PullRequest完成一次拉取消息任务后,又再次把它放回pullRequestQueue中,实现循环请求拉取。如果consumer向broker发送消息拉取请求后,没有消息到达消费队列:

如果未启用长轮询机制,则毁在服务端等待shortPollingTimeMills(挂起)后再判断消息是否到达消息队列,如果消息仍未到达则提示消息不存在(PULL_NOT_FOUND)。

如果启动长轮询机制,一方面会每10s检查消息是否到达,同时一有新消息到达马上通知挂起线程再次验证新消息是否感兴趣,如果不是则继续等待直到挂起超时(默认15s)。

长轮询模式通过longPollingEnable=true设置。

 

1.2 比较

推模式:broker负责消息存储、处理请求、推送状态等

优点是实时性好;缺点是如果push能力大于消费能力,则可能造成消费者挂掉或消息丢失;

 

拉模式:consumer除了消费消息还要保存偏移量,以及异常场景下消息缓存等

优点是拉取频率可以自己决定;缺点是可能造成broker消息堆积;

 

2 负载均衡

消息的分配遵循一个原则:一个consumer可以消费多个messageQueue,但是一个messageQueue只能分配给一个consumer消费。rocketMq共提供了5种分配算法:

1.AllocateMessageQueueAveragely:平均分配;

2.AllocateMessageQueueAveragelyByCircle:平均轮询分配;

3.AllocateMessageConsistentHash:一致性哈希;

4.AllocateMessageQueueByConfig:自定义配置;

5.AllocateMessageQueueByMacheRoom:根据broker机房名。

注意,基于上面的原则,当consumer数量大于messageQueue数量时,会有一部分consumer无法消费消息。

 

3 顺序消息

rocketMQ不保证一个topic下的所有messageQueue消息顺序性,但可以保证一个messageQueue下消息的顺序性。

 

4 延时消息

RocketMQ不支持自定义延时,目前共支持18个延时等级,分别为

1s,5s,10s,30s,1min,2min,3min,4min,5min,6min,7min,8min,9min,10min,20min,30min,1h,2h

在每个broker有一个默认topic,叫SCHEDULE_TOPIC_XXXX,这个topic下共有18个messageQueue,queueId从0到17,分别对应这18个延迟等级。同时对每个messageQueue设置一个定时任务,每隔1s到对应的messageQueue从最近一次处理的offset开始捞取要处理的消息,根据消息的物理偏移量和长度到commitLog里拿到完整消息体,然后构造出新的消息顺序写入commitLog,再将其投入到相应的messageQueue中去。

 

5 消息重试

集群模式下,消息的消费进度保存在broker(广播模式broker把消息广播出去就不负责了)。如果consumer返回RECONSUME_LATER,则broker启动消息重试机制。先将消息的topic和messageQueue保存到消息属性,然后将此消息存储到SCHEDULE_TOPIC_XXXX相应的延迟级别队列中。当到达重试时间后,该消息会被投入到topic为“%RETRY%消费者组名”的队列中,每台broker只会为同一个消费者组创建一个重试队列。“%RETRY%消费者组名”这个topic,在concumer启动的时候已经自动关注,所以当后面consumer来拉取消息时,会直接将重试消息拉走消费。

最佳实践:建议不要依赖rocketMQ的消息重试,可以自己在应用通过延时消息完成延时消息重试。

 

6 死信队列

当一条消息重试16次仍然失败,则进入死信队列,topic为“%DLQ%消费者组名”。不再被消费,需要人工处理。这里注意,每次重试消息延迟级别不是delayLevel++的,而是有一套根据重试次数的算法。

 

7 消息过滤

可以通过配置,使用消息的tag或表达式过滤。

 

RocketMQ知识盘点【壹】_Producer和NameServer

RocketMQ知识盘点【贰】_Broker和消息存储

RocketMQ知识盘点【叁】_Consumer

RocketMQ知识盘点【肆】_最佳实践

 

 

 

 

<think>好的,我需要回答用户关于RocketMQ中group_count指标的问题。首先,我得理解这个指标的具体含义。根据用户提供的引用内容,RocketMQ的消费者组(Consumer Group)是由多个消费者实例组成的,用于实现负载均衡和高可用。因此,group_count可能指的是消费者组的数量。 接下来,使用场景方面,用户可能想知道在监控集群状态、资源规划、故障排查或业务隔离时如何使用这个指标。比如,监控消费者组的数量是否异常增长,可能意味着资源浪费或配置错误。引用[1]提到消费者和队列的分配情况,这可能和group_count有关联,需要确认消费者组数量是否合理。 然后,关于监控方法,用户提到了rocketmq-exporter工具,引用[3]中提到了如何运行该工具导出指标到Prometheus。因此,需要说明如何配置和启动exporter,并通过Grafana展示group_count指标。同时,告警设置也是重要部分,当group_count超过阈值时触发告警。 在回答过程中,要确保正确引用提供的资料。例如,引用[1]说明消费者与队列的关系,引用[3]提供监控工具的使用方法。需要检查每个引用的内容是否准确对应到回答中的相关部分,避免错误引用。 可能还需要考虑用户的实际需求,比如他们可能想通过监控group_count来优化资源分配或预防潜在问题。因此,应用场景部分需要具体举例,帮助用户理解何时需要关注这个指标。 最后,确保回答结构清晰,分点说明含义、使用场景和监控方法,并在末尾添加相关问题,引导用户进一步探索。同时,按照用户的要求使用中文,正确应用LaTeX格式,比如变量用$...$,但看起来这里可能不需要数学公式,所以重点放在文本结构上。</think>### RocketMQ `group_count` 指标解析 #### 1. **指标含义** `group_count` 表示当前 RocketMQ 集群中**消费者组(Consumer Group)的数量**。消费者组是 RocketMQ 中消息消费的基本单元,一个消费者组可以包含多个消费者实例(Consumer Instance),通过负载均衡机制实现消息的高效分发[^1]。例如,若某 Topic 有 8 个消息队列,3 个消费者组,则每个消费者组可能分配不同数量的队列以实现并行消费。 #### 2. **使用场景** - **集群健康监控**:通过监控 `group_count` 的波动,可判断是否有消费者组异常增加(如配置错误导致重复注册)或减少(如消费者宕机)。 - **资源规划**:结合消费者组数量和队列数量(如引用[1]中提到的 8 个队列和 3 个消费者),评估集群负载是否均衡。 - **故障排查**:若 `group_count` 突降,可能意味着消费者组因网络或代码问题断开连接。 - **业务隔离分析**:不同业务通常使用独立的消费者组,`group_count` 可间接反映业务模块的复杂度。 #### 3. **监控方法** - **通过 RocketMQ Exporter 导出指标**: 引用[3]提到,使用 `rocketmq-exporter` 工具可将 RocketMQ 的指标导出到 Prometheus。启动命令如下: ```bash java -jar rocketmq-exporter-0.0.2-SNAPSHOT-exec.jar --rocketmq.config.namesrvAddr="127.0.0.1:9876" ``` 配置 Prometheus 抓取后,可通过 `rocketmq_group_count` 指标获取消费者组数量。 - **可视化与告警**: 在 Grafana 中创建仪表盘,监控 `rocketmq_group_count` 的变化趋势。若数值异常(如短时间内增减超过阈值),可通过 AlertManager 触发告警。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值