一、前言
RocketMQ是阿里巴巴开源的分布式消息中间件,现已捐献给Apache基金会。目前企业中常用的消息队列就是Kafka和rockerMQ,大多数场景下Kafka和RocketMQ都是可以使用,比如解耦、削峰等。两者也各自有擅长的地方,比如kafka擅长大数据量的流式处理上;而RocketMQ在消息查询、事务消息、严格顺序消息、定时消息等方面有更好的支持。
本系列文章主要集中解析RocketMQ消息发送、消费、存储、消息延迟等相关源码和原理。
- 走近RocketMQ:(二)RcoketMQ Producer消息发送【更新中】
- 走近RocketMQ:(三)RcoketMQ Broker消息接收和存储【更新中】
- 走近RocketMQ:(四)RcoketMQ Consumer消息消费【更新中】
- 走近RocketMQ:(五)RcoketMQ 延迟消息原理【更新中】
- 走近RocketMQ:(六)RcoketMQ 事务消息使用和原理【更新中】
- 走近RocketMQ:(七)RcoketMQ 顺序消息实现【更新中】
二、基础概念
在详细解析RocketMQ的原理之前,首先对RocketMQ的一些基础概念进行了解,方便后续内容的学习。
下图展示了RocketMQ的系统架构图,主要包括四部分:生产者(Producer)、消费者(Consumer)、集群(Broker)、路由注册中心(NameServer)
- 生产者(Producer):负责消息发送,提供同步发送、异步发送和单向发送三种方式
- 在发送时需要指定主题 (Topic) 和Topic所属的队列(MessageQueue)【队列可以不在程序指定,由RocketMQ SDK自身策略决定队列】,发送数据以消息(Message)的方式发送到集群(Broker)
- 消费者(Consumer):负责消息消费,提供了两种消费形式:拉模式消费和推模式消费,推模式消费实际上是“封装”的拉模式
- 所谓的拉模式,即从集群拉取所订阅Topic中的消息。
- 集群(Broker):核心提供消息存储以及为Producer和Consumer客户端提供读写服务,采用多主多从的集群架构保证高可用
- Broker的Master节点可提供读写服务,Slave节点只提供读服务,当一个Master节点不可用时, Consumer 会被自动切换到从Slave读,不影响Consumer程序运行
- 当创建Topic时,会在一组Broker(Broker组:相同 Broker名称,不同brokerId的机器组成)中所有的Master节点都创建多个Message Queue,当一个Master节点不可用时,Producer可以发消息到其他Master节点
- 路由注册中心(NameServer):为Producer和Consumer客户端根据 Topic 提供路由服务,从而引导客户端向 Broker 发送消息。NameServer 之间的节点不通信,其数据一致性采取的是最终一致性
- Broker节点在启动时,轮询NameServer集群,与每个NameServer节点建立长连接,发起注册请求
- Broker节点注册成功后,每隔30s定期向NameServer上报Topic路由信息,NameServer收到心跳包后记录Broker的最新时间戳
- Broker节点正常下线时,会与NameServer断开长连接,Netty的通道关闭,监听器会监听到连接断开事件,然后将这个Broker剔除掉
- NameServer中有一个定时任务,每隔10s扫描Broker列表,如果Broker的最新时间戳距离当前时间超过120s,会判定Broker失效并将其剔除掉
- 主题(Topic):用来消息传输和存储的顶层容器,一般一个topic对应一类业务场景
- 队列(MessageQueue):消息存储和传输的实际容器,一个Topic是由多个队列组成
- 消息(Message):数据的传输单元
以上即为RocketMQ相关核心概念的介绍。下面会介绍RocketMQ的Producer发送消息的相关流程和源码。 - 走近RocketMQ:(二)RcoketMQ Producer消息发送