RocketMQ入门
RocketMQ简介
RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件, 是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的*开源项目, 具有高性能、高可靠、高实时、分布式特点。
RocketMQ基本概念
RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分。
NameServer
NameServer类似于Zookeeper, 作为一个注册于发现中心, 各个角色(producer、broker、consumer等)都需要定时想nameserver上报自己的状态,以便互相发现彼此,超时不上报的话,nameserver会把它从列表中剔除。
NamServer可以部署多个(集群), 当多个nameserver存在的时候,其他角色同时向他们上报信息,以保证高可用。但是NamServer集群中各节点之间互不通信,无主从之分。
Broker
Broker的英文意思有经纪人、代理的意思。Broker同NameServer一样也是作为服务器部署, 是具体提供业务的服务器, 负责消息的接收、存储、发送。
Broker同样可以集群部署, 每个Broker节点,在启动时,都会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时上报。
Producer
消息生产者,负责产生消息,一般由业务系统负责产生消息。
RocketMQ 提供了三种方式发送消息:同步、异步和单向
- 同步发送: 同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。
- 异步发送: 异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包, 异步方式也需要Broker返回确认信息。
- 单向发送: 单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发。
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,获得Topic的路由信息,包括Topic下面有哪些Queue,这些Queue分布在哪些Broker上等, 接下来向提供Topic服务的Master建立长连接,且定时向Master发送心跳。
Consumer
消息消费者,负责消费消息,一般也是由业务系统负责消费
RocketMQ 提供了两种消息消费方式:拉取型(PULL)、推送型(PUSH)
- PULL: 主动从消息服务器拉取信息,只要批量拉取到消息,用户应用就会启动消费过程,所以 Pull 称为主动消费型。
- PUSH: 由Broker服务器主动向消费者推送消息, Consumer利用用户实现的回调接口消费消息。
Topic
Topic(主题), 可以看作是消息的分类, 它是消息的第一级类型, 一条消息必须有一个 Topic 。比如一个电商系统可以分为:交易消息、物流消息等。
Tag
Tag (标签) 是消息的第二级类型, 即是对同一Topic下的消息的进一步分类, 如订单类的消息(Topic)下可以又分为订单创建消息、订单取消消息、订单完成消息等。一条消息可以没有 Tag。
完整的运作流程
上面介绍了RocketMQ的各个角色及其作用, 下面我们看一下各角色之间完整的交互过程。
-
首先启动NameServer, 可以以集群方式部署。
-
启动Broker, 在启动时,Broker会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时发送心跳且上报自己所负责的Topic信息。
-
Producer与Consumer启动时也会与NameServer建立长连接, 获取Broker信息和Topic信息,接下来向提供topic服务的master建立长连接(因为rocketmq只有master才能写消息),且定时向master发送心跳。
Tips: Producer只会与Broker的Master建立连接, 因为只有Master是可写的, Consumer会与Master和Slave都建立连接进行消费消息。