写点什么

面试官:RocketMQ 消费者是如何获取消息的?

发布于: 2021 年 05 月 06 日
面试官:RocketMQ消费者是如何获取消息的?

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 来消费


作者:baojh

链接:https://juejin.cn/post/6958992100826775566

来源:掘金

用户头像

还未添加个人签名 2020.06.14 加入

领取文中资料加微信:gyhycx7980 备注:InfoQ 即可

评论

发布
暂无评论
面试官:RocketMQ消费者是如何获取消息的?