RocketMQ生产者与消费者

Producer

Producer将消息发送到某Broker中的Queue中,经历如下过程

  • Producer发送消息之前,会先去NameServer拉取Topic的路由信息
  • NameServer返回该Topic信息及Broker列表

  • Producer根据代码中指定的Queue选择策略,从Queue列表中选出一个队列,用于发送消息

  • Produer对消息做一些处理,例如,消息本身超过4M,则会对其进行压缩

  • Producer向选择出的Queue所在的Broker发出RPC请求,将消息发送到选择出的Queue

Queue选择算法

对于无序消息,其Queue选择算法,也称为消息投递算法,常见的有两种

  • 1)轮询算法(默认)该算法保证了每个Queue中可以均匀的获取到消息。(缺点:由于某些原因、在某些Broker上的Queue可能投递延迟较严重。从而导致 Producer的缓存队列中出现较大的消息积压、影响消息的投递性能。)

2 最小投递延迟算法。该算法会统计每次消息投递的时间延迟,然后根据统计出的结果将消息投递到时间延迟最小的Queue。 如果延迟相同,则采用轮询算法投递。该算法可以有效提升消息的投递性能。(缺点:消息在Queue上的分配不均匀。投递延迟小的Queue其可能会存在大量 的消息。而对该Queue的消费者压力会增大、降低消息的消费能力、  可能会导致MQ中消息的堆 积。) 

Consumer

消费模

1)广播模式:
RocketMQ生产者与消费者_第1张图片

 广播消费模式下,相同Consumer Group的每个Consumer实例都接收同一个Topic的全量消息。即每条消息都会被发送到Consumer Group中的每个Consumer。

2)集群消费:
RocketMQ生产者与消费者_第2张图片

 集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊同一个Topic的消息。即每条消息只会被发送到Consumer Group中的某个Consumer。

息进度保存

广播模式:消费进度保存在consumer端。因为广播模式下consumer group中每个consumer都会费所有消息,但它们的消费进度是不同。所以consumer各自保存各自的消费进度。

群模式:消费进度保存在broker中。  consumer group中的所有consumer共同消费同一个Topic 中的消息,同一条消息只会被消费一次。

Rebalance机制

什么是Rebalance;Rebalance即再均衡,指的是,将⼀个Topic下的多个Queue在同⼀个Consumer Group中的多个 Consumer间进行重新分配的过程。

Rebalance危害
1)暂停消费:  例如在只有一个Consumer时,其负责消费所有队列;在新增了一个Consumer后会触发Rebalance的发生。此时原Consumer就需要暂停部分队列的消费,等到这些队列分配给新的Consumer 后,这些暂停的队列才能继续被消费。
2)消费重复:  Consumer 在消费新分配给自己的队列时,必须接着之前Consumer 提交的消费进度的offset 继续消费。然而默认情况下,  offset是异步提交的,这个异步性导致提交到Broker的offset与Consumer  实际消费的消息并不一致。这可能会导致重复消费。

Rebalance过程

在Broker中维护着多个Map集合,这些集合中动态存放着当前Topic中Queue的信息、  Consumer Group 中Consumer实例的信息。一旦发现消费者所订阅的Queue数量发生变化,或消费者组中消费者的数量Consumer实例在接收到通知后会采用 Queue分配算法 自己获取到相应的Queue,即由Consumer实例 自主进行Rebalance。

Kafka对比
在Kafka中,一旦发现出现了Rebalance条件,  Broker会调用Group Coordinator来完成Rebalance。     Coordinator是Broker中的一个进程。  Coordinator会在Consumer Group中选出一个Group Leader。由 这个Leader根据自己本身组情况完成Partition分区的再分配。这个再分配结果会上报给Coordinator, 并由Coordinator同步给Group中的所有Consumer实例。Kafka中的Rebalance是由Consumer Leader完成的。
而RocketMQ中的Rebalance是由每个Consumer自 身完成的,  Group中不存在Leader。

Consumer Queue分配算法
一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同 消费多个Queue中的消息。那么QueueConsumer间的配对关系是如何确定的,即Queue要分配给   Consumer消费,也是有算法策略的。常见的有四种策略。

1)平均分配策略(AllocateMessageQueueAveragely 默认
RocketMQ生产者与消费者_第3张图片

该算法是要根据 avg = QueueCount / ConsumerCount的计算结果进行分配的。如果能够整除, 则按顺序将avg个Queue逐个分配Consumer;如果不能整除,则将多余出的Queue按照Consumer顺序 逐个分配。

 2)形平均策略(AllocateMessageQueueAveragelyByCircle
RocketMQ生产者与消费者_第4张图片

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

 3)致性hash策略(AllocateMessageQueueConsistentHash
RocketMQ生产者与消费者_第5张图片

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

 4)房策略(AllocateMachineRoomNearby)
RocketMQ生产者与消费者_第6张图片

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

你可能感兴趣的:(kafka,java,大数据)