在上一章中,我们跑通了Quick Start,也对RocketMQ有了一个大致的了解。先看下一张简单的RocketMQ部署图,有个全局的感官:
本章节的目的就是了解RocketMQ涉及到的概念以及整体架构介绍。
Producer 与 Producer Group
Producer表示消息队列的生产者,这没什么好解释的,重点了解下这里的Producer Group,先来看Producer中的一段代码,该实例代码位于example子项目的quickstart包中
功能就是初始化一个producer实例,并且启动。能体现出Group概念的,只是DefaultMQProducer构造函数的参数。查了一些文档,这个producer实例有些地方需要注意一下。一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例。ProducerGroupName需要由应用来保证唯一。这样的话,假设有两个项目Project_A和Project_B,每个项目部署两台机器,那么Producer的分布如下:
Consumer 与 Consumer Group
Consumer表示消息的消费者,Consumer被分为两类:Push Consumer和Pull Consumer:
- 应用向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法
- 应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制
其实它们的本质都是拉模式(pull),因为RocketMQ的实际就是Consumer从Broker拉消息来消费,但是为了能做到实时收消息,使用了长轮询方式来保证消息实时性。两者的区别是,Push Consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。Pull Consumer取消息的过程需要用户自己写。‘
Consumer Group的概念和Producer Group类似,但是涉及到消息的消费方式:广播消费和集群消费。
- 广播消费:一条消息被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被Consumer Group中的每个Consumer都消费一次。
- 集群消费:一个Consumer Group中的Consumer实例平均分摊消费消息,也就是说排除网络等其他原因,一条消息只会被消费一次。大多数场景应该使用的是此种消费方式。
Broker
Broker是RocketMQ的核心,负责存储和转发消息,其实就是消息队列服务器,需要保证高可用。
NameServer
NameServer即名称服务,有两个功能:
- 接收broker的请求,注册broker的路由信息
- 接口client的请求,根据某个topic获取其到broker的路由信息
NameServer被设计成几乎无状态的,可以横向扩展,节点之间无任何信息同步。每个Broker在启动的时候会到NameServer注册,Producer在发送消息前会根据topic到NameServer获取路由(到broker)信息,Consumer也会定时获取topic路由信息。
消息相关解释
关于消息,有如下几点需要了解下:
- Topic:表示消息的第一级类型,比如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个Topic。RocketMQ最佳实践给出的建议是,一个应用尽可能用一个Topic。
- Tag:表示消息的第二级类型,比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有Tag。
- Queue:消息队列,一个Topic下我们可以设置多个Queue。当发送消息时,需要执行该消息的Topic,RocketMQ会轮询该Topic下的所有队列,将消息发出去。
那么单个Broker内的消息情况如下所示:
总结
再看一下本篇开头的网络部署图,最后做个总结。
Name Server是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步。
Broker分为Master与Slave,具体线上应该怎么部署,后面再深究。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。