文章目录
背景
业务团队反馈使用我提供的RocketMQ集群,上游生产的消息,部分消息,消费程序需要等1分钟,甚至几分钟后,才能收到。
问题排查
见怪不怪,大部分的问题,都是和客户端的使用上有关系,根据一番了解,业务方是这样写消费者程序的:
- 消费者使用拉模式;
- 消费者有3个实例;
- 使用了XXL-JOB做任务调度,每分钟执行一次,触发消费者的拉取操作
- XXL-JOB使用的是轮询的调度方式。
到这里,如果了解RocketMQ消费者机制的,应该已经知道问题了,下面是简单的思路总结:
- RocketMQ创建Topic时会有队列数的配置,类似于Kafka的Partition;
- 例如:RocketMQ集群有3个Broker,创建Topic时设置读队列数为16,这个Topic的总的消费队列为48;
- 所有消费者实例会近似平均地去负责这48个队列,也就是说,每隔1分钟,用轮询的方式去执行消费,每次只会消费到topic中1/3的消息,下一次JOB执行,才会继续消费,这中间JOB执行的间隔,就导致了消费的延迟。
下面详细说一下RocketMQ消费者的负载均衡机制。
Consumer负载均衡机制
集群模式下,同一个消费组内的消费者会分担收到的全量消息,这里的分配策略是怎样的?如果扩容消费者是否一定能提升消费能力?
Apache RocketMQ 提供了多种集群模式下的分配策略,包括平均分配策略、机房优先分配策略、一致性hash分配策略等,可以通过如下代码进行设置相应负载均衡策略。
consumer.setAl