[简介来源github项目自述]Apache RocketMQ是一个分布式消息和流媒体平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可扩展性。(由阿里巴巴开源)
它提供了多种功能:
整体可以分成4个角色,分别是:Producer,Consumer,Broker以及NameServer;
组成图【来源: RocketMQ之一:RocketMQ整体介绍 - Oops!# - 博客园】消息队列的协调者,Broker向它注册路由信息;是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。在消息队列 RocketMQ 中提供命名服务,更新和发现 Broker 服务
两个功能:
broker
的请求,注册broker
的路由信息client(producer/consumer)
的请求,根据某个topic
获取其到broker
的路由信息NameServer
没有状态,可以横向扩展。每个broker
在启动的时候会到NameServer
注册;Producer
在发送消息前会根据topic
到NameServer
获取路由(到broker
)信息;Consumer
也会定时获取topic
路由信息。Broker是RocketMQ的核心,提供了消息的接收,存储,拉取等功能
Broker分为Master和Slave,一个Master可以对应多个Slave,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave;
因为broker是核心,一般都需要保证Broker的高可用,所以会配置Broker Slave,当Master挂掉之后,Consumer然后可以消费Slave;
对于master和slave;master可以对应多个slave,而slave只能对应一个master
每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。Broker 启动后需要完成一次将自己注册至 Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。
消息队列的生产者,需要与NameServer建立长连接Keep-alive,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立连接(连接ip由nameserver中获取)
与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
Topic、Queue、message、tags
来源【 RocketMQ之一:RocketMQ整体介绍 - Oops!# - 博客园】
RocketMQ中的topic代表普通的消息队列,Queue是组成消息队列的更小单元【在JMS中,queue是只能被一个消费者消费,消费者消费topic的副本】
topic
:
表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息...... 一条消息必须有一个Topic。
topic
下,我们可以设置多个queue(消息队列)
。当我们发送消息时,需要要指定该消息的topic
。RocketMQ会轮询该topic
下的所有队列,将消息发送出去。Queue是Topic在一个Broker上的分片,在分片基础上再等分为若干份(可指定份数)后的其中一份,是负载均衡过程中资源分配的基本单元。
集群消费模式下一个消费者只消费该Topic中部分Queue中的消息,当一个消费者开启广播模式时则会消费该Topic下所有Queue中的消息
message则是消息的载体,消息必须包含一个topic,相当于寄信地址,可选tags,用于消费者进行过滤消息
标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。