RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
一、RocketMQ集群架构与角色分工
以上RocketMq的集群架构图,里面包含四个主要部分:
NameServer集群、Producer集群、Cosumer集群以及Broker集群。
1、NameServer 担任路由消息的提供者。生产者或消费者能够通过NameServer查找各Topic相应的Broker IP列表分别进行发送消息和消费消息。nameServer由多个无状态的节点构成,节点之间无任何信息同步。
broker会定期向NameServer以发送心跳包的方式,轮询向所有NameServer注册以下元数据信息:
- broker的基本信息(ip port等)
- 主题topic的地址信息
- broker集群信息
- 存活的broker信息
- filter 过滤器
也就是说,每个NameServer注册的信息都是一样的,而且是当前系统中的所有broker的元数据信息。
2、Producer负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。
RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。
3、Broker,消息中转角色,负责存储消息、转发消息。在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。
4、Consumer负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。
从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。同时,与Kafka类似,RocketMq也同样有消费者组的概念。
此外,RocketMq同样存在Broker、Topic以及Partation概念,且概念基本一致。
二、RocketMq工作流程
RocketMq的工作流程如下:
1、首先启动NameServer服务。NameServer启动后监听端口,等待Broker、Producer以及Consumer连上来。
2、启动Broker。启动之后,会跟所有的NameServer建立并保持一个长连接,定时发送心跳包。心跳包中包含当前Broker信息(ip、port等)、Topic信息以及Borker与Topic的映射关系。
3、创建Topic。创建时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4、Producer发送消息。启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic所在的Broker;然后从队列列表中轮询选择一个队列,与队列所在的Broker建立长连接,进行消息的发送。
5、消息到达Broker的master节点。当配置为同步复制时,master需要先将消息复制到slave节点,然后再返回“写成功状态”响应给生产者;当配置为同步刷盘时,则还需要将消息写入磁盘中,再返回“写成功状态”;要是配置的是异步刷盘和异步复制,则消息只要发送到master节点,就直接返回“写成功”状态。
6、Consumer消费消息。跟其中一台NameServer建立长连接,获取当前订阅的Topic存在哪些Broker上,然后直接跟Broker建立连接通道,进行消息的消费。
总结
RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
—————END—————
喜欢本文的朋友,欢迎关注,收看更多的精彩内容!