一、基本概念
1. 消息模型
RocketMQ 采取了发布订阅模式作为消息模型,由消息生产者、代理服务器、消息消费者三方构成了消息模型
2. 消息
概念:消息即消息系统所传输信息的物理载体,是生产和消费数据的最小单位。
属性:在 RocketMQ 中,消息具有以下属性
- topic:每个消息都属于一个主题,通过订阅发布模式在生产者和消费者之间传递。
- ID:每个消息都具有的唯一的 Message ID。
- key:业务标识 key。
- tag:消息标签,用于同一主题下区分不同类型的消息。
RocketMQ 提供了根据 Message ID 和 key 查询消息的功能。
3. 消息生产者(Producer)
概念:消息的生产者主要负责生产消息并将消息发送至 broker 服务器中,一般由业务系统担任。
扩展:生产者组(Producer Group),是同一类 Producer 的集合,一般用做集群部署用以避免单点故障,提高性能等。通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递。
消息发送方式:RocketMQ 提供了多种消息发送方式,包括同步发送、异步发送、顺序发送、单向发送等。
4. 消息消费者(Consumer)
概念:消息消费者负责消费消息,一般由后台系统负责消费消息。消息消费者从 broker 服务器拉取消息,并将消息提供至应用程序。
扩展:消费者组(Consumer Group),是同一类 Consumer 的集合。
消息消费方式:RocketMQ支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。
-
集群消费:集群模式下,相同消费者组的每个消费者实例平均分摊消息,即一个消息只会被某个消费者消费一次。
-
广播模式:广播模式下,相同消费者组的每个消费者实例都接受全量的消息,即一个消息会被消费者组内的所有实例各消费一次。
消息拉取方式:RocketMQ支持以 push 和 pull 两种模式对消息进行消费。从概念上讲
- Pull 模式:应用侧会主动调用 Consumer 的拉取消息方法,从 Broker 服务器拉取消息,主动权由应用控制。一旦获取了批量消息,应用会启动消费过程
- Push 模式:Broker 服务器收到消息数据后会主动推送给消费端,该模式一般实时性比较高
实际上,Push 模式只是对 pull 模式的一种封装。其本质实现为:消息拉取线程在从服务器拉取到一批消息后,提交到消息消费线程池,然后“马不停蹄”的继续向服务器再次尝试拉取消息;当没有拉取到消息,则延迟一下后又继续拉取。
5. 代理服务器(Broker Server)
概念:代理服务器是消息的中转角色,主要功能是进行消息的存储和消息的转发,是消息队列中间件的核心。Broker 在 RocketMQ 系统中,负责接收从生产者发送来的消息,并进行存储,同时为消费者的拉取请求做准备。
模块:为了实现消息的基本功能并保证服务的高可用,broker 包含了以下几个重要的子模块
- Remoting Module:整个 Broker 实体,负责处理来自 clients 端的请求
- Client Manager:负责管理客户端和维护 Consumer 的 Topic 订阅信息
- Store Service:提供方便简单的 API 接口处理消息存储到物理硬盘和查询功能
- HA Service:高可用服务,提供了 Broker 主从节点之间的数据同步功能
- Index Service:根据特点的 Message key 对投递到 Broker 的消息进行索引服务,以提供消息的快速查询
6. 名字服务(Name Server)
概念:名字服务充当路由消息的提供者。生产者和消费者能够通过名字服务查找各主题相应的 Broker IP 列表。Name Server 主要包括两个功能:Broker管理和路由信息管理。
- Broker管理:接受 Broker 集群的注册信息并保存下来作为路由信息的基本数据。提供心跳检测机制,检测 Broker 是否还存活。
- 路由信息管理:每个 NameServer 将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。
扩展:多个Namesrv实例组成集群,但相互独立,没有信息交换,Broker 是向每一台 NameServer 注册自己的路由信息,因此每个 Namesrv 实例上面都保存了一份完整的路由信息。