都知道Rocketmq中有ConsumerGroup的概念。在集群模式下,多台服务器配置相同的ConsumerGroup,能够使得每次只有一台服务器消费消息(注意,但不保证只消费一次,存在网络抖动的情况)。那么,笔者就很疑惑,Rocketmq是如何实现这个模式的?如何保证只有一台服务器消费?
虽然答案很简单,但却是一个很好的带着问题看源码的机会。
RocketMq结构
从图中可以看到,MQ主要投递消息和拉取消息两个环节。
众多的架构都是顺应时代潮流而来,Rocketmq的结构体系当然也不是阿里所独创的,而是依据AMQP协议而来。Rocketmq中的Producer,Broker,以及Consumer都是依据AMQP中的概念衍生出来的。所以这里不妨讲讲AMQP(Advanced Message Queuing Protocal,高级消息队列协议),便于大家更好的理解技术的发展过程。
paper下载 http://www.amqp.org/specification/0-9-1/amqp-org-download
- Broker: 接收和分发的应用
- Virtual host:出于多租户和安全因素,把AMQP的基本组件划分到一个虚拟分组中。各个租户之间是网络隔离的,类似Linux中的namespace概念(可自行Google)
- Connection:publisher/consumer 和broker之间的TCP连接
- Channel:是相较于Connection更加轻量的连接,是Connection上的逻辑连接
- Exchange: 负责将message分发到不同的Queue中
- Queue: 消息最终会落到Queue中,消息由Broker push给Consumer或者由Consumer来pull消息
- Binding:exchange和queue之间的消息路由策略
消息队列的3大类型
当然基于这样一个协议,不单单是RocketMq一个闪耀在消息队列选型中,还有不同的消息队列。
https://mp.weixin.qq.com/s/B1D-J_1wpaqj0sxcmaArbQ
主要分为了3大阵营:
- 有Broker 重Topic流:kafka,JMS
- 有Broker 轻Topic流: RocketMQ
- 无Broker: ZeroMQ
当然,如果熟悉了AMQP协议,你也可以选择自研一个消息队列
https://zhuanlan.zhihu.com/p/28967866
了解了一些背景,来看下RocketM