RocketMQ整体介绍
1. RocketMQ简介
1.1 简介
RocketMQ是一款纯java、分布式、队列模型的消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。
1.2 特点
- 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
- 在一个队列中可靠的先进先出和严格的顺序传递
- 支持拉(pull)和推(push)两种消息模式
- 单一队列百万消息的堆积能力
- 支持多种消息协议,如JMS、MQTT等
- 分布式高可用的部署架构,满足至少一次消息传递
- 较少的依赖
1.3 应用场景
- 异步解耦
- 分布式事务的数据一致性
- 消息的顺序收发
- 削峰填谷
- 大规模机器的缓存同步
2. RocketMQ基本概念
2.1 三个核心角色
Producer: 消息生产者,作用就是将消息发送到Broker。提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息。
Consumer: 消息消费者,负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户角度而言提供了拉取式消费和推动式消费。
Broker: 消息中转角色,负责存储消息、转发消息。Broker也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。
角色之间关系如图
2.2 基本定义
Topic: 是一种消息的逻辑分类,比如订单消息、物流消息…
Tag: 用于同一Topic下区分不同类型的消息。比如订单创建消息、订单完成消息…
NameServer: 充当路由消息的提供者。接收broker的请求,注册broker的路有消息;接收client(producer/consumer)的请求,根据topic获取到broker ip列表。可集群部署,节点间无任何信息同步
Message: 消息系统所传输信息的物理载体,生产和消费数据的最小单位。每个消息拥有唯一的Message ID,且可以携带具有业务标识的key。系统提供了通过Message ID和key查询消息的功能。
Producer Group: 同一类producer的集合,这类producer发送同一类消息,且发送逻辑一致
Consumer Group: 同一类consumer的集合,这类consumer通常消费同一类消息且消费逻辑一致。消费者组使得消息消费方面实现负载均衡和容错的目标变得非常容易。RocketMQ支持两种消费模式:集群消费和广播消费
3. RocketMQ整体流程
3.1 整体架构
3.2 流程
- 启动NameServer,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心
- Broker启动,跟所有的NameServer保持长连接,定时发动心跳包。心跳包中包含当前Broker信息(IP+Port)以及存储所有topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系
- 收发消息前,先创建topic,创建topic时需要指定该topic存储在哪些Broker上,也可以在发送消息时自动创建topic
- Producer发送消息,启动时先跟NameServer集群中的一台建立长连接,并从NameServer中获取当前发送的topic存在哪些Broker上,轮询从队列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息
- Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后跟Broker建立连接,开始消费消息
4. 消息的发布与订阅
4.1 消息的通信方式
- 同步消息: 消息发送方发出数据后,会阻塞,直到Broker发回响应消息
- 异步消息: 消息发送方发出数据后,不等待Broker发回响应,接着发送下个数据包。MQ的异步发送,需要用户实现异步发送回调接口,在执行消息的异步发送时,应用不需要等