RocketMQ概念解析

1,210 阅读4分钟

RocketMQ简介

RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件, 是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目, 具有高性能、高可靠、高实时、分布式特点。

RocketMQ基本概念

RocketMQ主要有四大核心组成部分:NameServerBrokerProducer以及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。

Group

Group(组)代表同一类的生产者或消费者, 用在生产者时,仅起到标识作用。当用在消费者时,Broker对消息的投递以组为管理单位。如:同一个下单成功的消息,积分服务和订单服务两个消费者都要消费,做各自的业务处理。他们就需要定义成不同的消费者组,broker会将消息分别投递给这两个组的消费者。

Tips:RocketMQ 要求同一组内的消费者订阅的TOPIC 和 TAG必须相同。

完整的运作流程

上面介绍了RocketMQ的各个角色及其作用, 下面我们看一下各角色之间完整的交互过程。

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都建立连接进行消费消息。