searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

rocketMq消费队列问题定位与queue分配算法分析

2023-05-29 01:56:00
160
0

一. 基础概念
Producer: 消息生产者,负责产生消息,一般由业务系统负责产生消息
Producer Group:消息生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者
Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费
Consumer Group:消费者组,和生产者类似,消费同一类消息的多个 Consumer 实例组成一个消费者组
Topic:主题,用于将消息按主题做划分,Producer将消息发往指定的Topic,Consumer订阅该Topic就可以收到这条消息
Broker:Broker是RocketMQ的核心模块,负责接收并存储消息,同时提供Push/Pull接口来将消息发送给Consumer。Broker同时提供消息查询的功能,可以通过MessageID和MessageKey来查询消息。Borker会将自己的Topic配置信息实时同步到NameServer
Queue:Topic和Queue是1对多的关系,一个Topic下可以包含多个Queue,主要用于负载均衡,Queue数量设置建议不要比消费者数少。发送消息时,用户只指定Topic,Producer会根据Topic的路由信息选择具体发到哪个Queue上。Consumer订阅消息时,会根据负载均衡策略决定订阅哪些Queue的消息

二、现象与原因

2个实例消费rocketmq, 出现消息有的消息能消费,有的不能消费, 观察mq管理端, 发现4个队列,有两个队列没有消费端消费,通过分析, 原来两个实例标识一样, 通过源码分析,消费端的实例标识是由消费端IP+消费名组成,由于本地机器是docker,虚机, 获取的ip相同, 所以两个实例标识一样,导致队列2个队列未能分配至消费实例,

 

三、rocketMq 消费Queue分配算法
一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。那么Queue与Consumer间的配对关系是如何确定的,即Queue要分配给哪个Consumer进行消费,也是有算法策略的。常见的有四种策略。这些策略是通过在创建Consumer时的构造器传进去的。

一、平均分配策略:

一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。那么Queue与Consumer间的配对关系是如何确定的,即Queue要分配给哪个Consumer进行消费,也是有算法策略的。常见的有四种策略。这些策略是通过在创建Consumer时的构造器传进去的。
该算法是要根据avg = QueueCount / ConsumerCount 的计算结果进行分配的。如果能够整除, 则按顺序将avg个Queue逐个分配Consumer;如果不能整除,则将多余出的Queue按照Consumer顺序逐个分配。

二、环形平均算法是指,根据消费者的顺序,依次在由queue队列组成的环形图中逐个分配。

三、一致性hash策略:该算法会将consumer的hash值作为Node节点存放到hash环上,然后将queue的hash值也放到hash环 上,通过顺时针方向,距离queue最近的那个consumer就是该queue要分配的consumer。

四、同机房策略:该算法会根据queue的部署机房位置和consumer的位置,过滤出当前consumer相同机房的queue。然 后按照平均分配策略或环形平均策略对同机房queue进行分配。如果没有同机房queue,则按照平均分配策略或环形平均策略对所有queue进行分配。

0条评论
0 / 1000
x****n
5文章数
0粉丝数
x****n
5 文章 | 0 粉丝
原创

rocketMq消费队列问题定位与queue分配算法分析

2023-05-29 01:56:00
160
0

一. 基础概念
Producer: 消息生产者,负责产生消息,一般由业务系统负责产生消息
Producer Group:消息生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者
Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费
Consumer Group:消费者组,和生产者类似,消费同一类消息的多个 Consumer 实例组成一个消费者组
Topic:主题,用于将消息按主题做划分,Producer将消息发往指定的Topic,Consumer订阅该Topic就可以收到这条消息
Broker:Broker是RocketMQ的核心模块,负责接收并存储消息,同时提供Push/Pull接口来将消息发送给Consumer。Broker同时提供消息查询的功能,可以通过MessageID和MessageKey来查询消息。Borker会将自己的Topic配置信息实时同步到NameServer
Queue:Topic和Queue是1对多的关系,一个Topic下可以包含多个Queue,主要用于负载均衡,Queue数量设置建议不要比消费者数少。发送消息时,用户只指定Topic,Producer会根据Topic的路由信息选择具体发到哪个Queue上。Consumer订阅消息时,会根据负载均衡策略决定订阅哪些Queue的消息

二、现象与原因

2个实例消费rocketmq, 出现消息有的消息能消费,有的不能消费, 观察mq管理端, 发现4个队列,有两个队列没有消费端消费,通过分析, 原来两个实例标识一样, 通过源码分析,消费端的实例标识是由消费端IP+消费名组成,由于本地机器是docker,虚机, 获取的ip相同, 所以两个实例标识一样,导致队列2个队列未能分配至消费实例,

 

三、rocketMq 消费Queue分配算法
一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。那么Queue与Consumer间的配对关系是如何确定的,即Queue要分配给哪个Consumer进行消费,也是有算法策略的。常见的有四种策略。这些策略是通过在创建Consumer时的构造器传进去的。

一、平均分配策略:

一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。那么Queue与Consumer间的配对关系是如何确定的,即Queue要分配给哪个Consumer进行消费,也是有算法策略的。常见的有四种策略。这些策略是通过在创建Consumer时的构造器传进去的。
该算法是要根据avg = QueueCount / ConsumerCount 的计算结果进行分配的。如果能够整除, 则按顺序将avg个Queue逐个分配Consumer;如果不能整除,则将多余出的Queue按照Consumer顺序逐个分配。

二、环形平均算法是指,根据消费者的顺序,依次在由queue队列组成的环形图中逐个分配。

三、一致性hash策略:该算法会将consumer的hash值作为Node节点存放到hash环上,然后将queue的hash值也放到hash环 上,通过顺时针方向,距离queue最近的那个consumer就是该queue要分配的consumer。

四、同机房策略:该算法会根据queue的部署机房位置和consumer的位置,过滤出当前consumer相同机房的queue。然 后按照平均分配策略或环形平均策略对同机房queue进行分配。如果没有同机房queue,则按照平均分配策略或环形平均策略对所有queue进行分配。

文章来自个人专栏
openfire中间件
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0