1:什么是消费者组
消费者组:假设我们现在有一个Topic叫做order_topic,现在营销系统,库存系统系统都要去order_topic去消费消息,那么我们应该为营销系统和库存系统分别建立一个消费者组,比如:营销系统的消费者组名称是 {marking_groups},库存系统的消费者是: {stock_groups}。
比如现在库存系统部署了二台机器,那么这二台机器就组成了一个消费者组。营销系统有二台机器,那么这二台机器也组成一个一个消费者组
这二个消费者组都订阅了order_topic这个topic,那么现在生产者发送了一条消息到Master Broker之后,如下图
现在二个消费者组都会去这个Broker去拉取消息,那么现在库存系统和营销系统都有二台机器,那么对于库存系统来说,是只有一台机器能够获取到这条消息还是说每台机器都会获取到这条消息呢??
这个时候就要介绍一个集群模式和广播模式了
2:集群模式和广播模式
集群模式:也就是说一条消息只会被一个消费者组中的一台机器消费,比如库存系统有二台机器组成的消费者组,那么一条消息只会被其中的一台机器消费
广播模式:每一条消息都会被消费组中的每台机器给消费一次,也就是说库存系统的二台机器都会消费同一条消息
3:重温MessageQueue,ConsumeQueue,CommitLog
之前我们讲过设置一个Topic那么就要设置MessageQueue,这条消息发送到Broker之后也会被写入到CommitLog中,而且每个MessageQueue底层也会对应着一个的ConsumerQueue。
但是对于Broker而言,同一台机器的消息都是存储在CommotLog文件中的。具体的细节可以参考我的文章 juejin.cn/post/695645…
4:MessageQueue与消费者的关系
对于同一个Topic对应着多个MessageQueue,那么多个MessageQueue是如何让多台机器进行消费的呢??
我们可以简单的理解为,RocketMq会将多个MessageQueue均匀的分配给每台机器来进行消费
举个例子:现在有一个Topic,对应着4个MessageQueue,然后现在有2个Master Broker,那么每个Master Broker上有二个MessageQueue,现在有个库存系统订阅了这个Topic,库存系统有二台机器组成了一个消费者组,那么现在最好的情况就是让库存的2台机器每台负责2个MessageQueue,
所以我们可以大致认为,一个Topic中的多个MessageQueue会均匀分配给消费者组的每台机器去消费,前提是一个MessageQueue只能被一台机器消费,但是一台机器可以消费多个MessageQueue的消息
5:Broker是如何将消息发送给消费者的
我们可以回忆一下,生产者将消息发送给Broker之后,Broker就会将这条消息写入到CommitLog中,每个MessageQueue都有一个对应的ConsumeQueue的磁盘文件,而这个文件就是MessageQueue中的消息在CommitLog中的偏移量。
消费者模式一般都是基于集群模式的,也就是说一条消息只会被消费一次,所以如果此时消费者1要消费MessageQueue1中的消息,那么就会从ConsumeQueue1的文件中找到这条消息在CommitLog中的偏移量,然后将这条消息发送给消费者
6:消费者组中某个消费者挂了或者扩容机器怎么办
假如现在我们有一个Broker0和Broker1,Broker0对应着MessageQueue0,MessageQueue1,Broker1对应着MessageQueue2,MessageQueue3,现在有一个消费者组Consume0,Consume1,
然后现在Consume0消费MessageQueue0,MessageQueue1中的消息,Consume1消费MessageQueue2,MessageQueue3中的消息,如果此时Consume1挂掉了,那么MessageQueue2,MessageQueue3中的消息就会都让Consume0来消费了,同理,如果此时我们给消费组增加一台机器,那么此时就会进入一个rabalance环节,这时候会将其中的一个MessageQueue交给Consume3来消费