RocketMQ核心概念
# NameServer
主要负责Topic
和路由信息的管理,功能类似Dubbo
的zookeeper
。
无状态节点,可集群部署,节点之间无任何信息同步。
Broker
每30秒向NameServer
发送心跳包,心跳包中包含topic
的路由信息。
NameServer
受到Broker
心跳包后更新brokerLiveTable
中的信息,特别记录心跳时间lastUpdateTime
NameServer
每隔10s扫描brokerLiveTable
,检测表中上次收到的心跳包时间,比较当前时间与上一次时间,超过120秒在,则认为Broker
不可用,移除路由表中与该Broker
的相关信息。
生产者拉取主题的路由信息,即消息生产者并不立即感知Broker
服务器的新增与删除。
# Producer
消息生产者。
Producer
与NameServer
集群中的其中一个节点(随机选择)建立长连接,定期从NameServer
取Topic
路由信息,并向提供Topic服务的Master
建立长连接,且定时向Master
发送心跳。Producer
完全无状态,可集群部署。
# Broker
消息中转角色,负责消息存储、转发。
Broker
分为Master
和Slave
,一个Master
可以对应多个Slave
,但是一个Slave
只能对应一个Master
,Master
与Slave
对应关系通过指定相同的BrokerName
,不同的BrokerId
来定义,BrokerId
为0表示Master
,非0表示Slave
。Master
也可以部署多个。每个Broker
与NameServer
集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer
。
# Consumer
消费者
Consumer
与NameServer
集群中的其中一个节点(随机选择)建立长连接,定期从NameServer
取Topic路由信息,并向提供Topic服务的Master
、Slave
建立长连接,且定时向Master
、Slave
发送心跳。Consumer
既可以从Master订阅消息,也可以从Slave
订阅消息,订阅规则由Broker配置决定。
# Producer Group
用来表示一个发送信息的应用,一个Prducer Group
下包含多个Producer
实例,可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个Producer
对象。一个Producer Group可以发送多个Topic消息。
在分布式系统中,发送事务消息时,如果Producer
中途意外宕机,Broker
会主动回调Producer Group
内的任意一台机器来确认事务状态。
# Consumer Group
用来表示一个消费消息的应用。一个Consumer Group
下包含多个Consumer
实例,可以是多台机器、多个进程或一个进程的多个实例对象。不同Consumer Group
都会受到消息,一个Consumer Group
下的多个Consumer
以均摊的方式消费消息)。如果设置为广播方式,那么这个Consumer Group
下的每个实例都消费全量数据。
# Topic
消息的第一级类型
最细粒度的订阅单位,一个Group可以订阅多个Topic
# Tag
消息的第二级类型,方便灵活控制。
同一个Consumer Group
下的Consumer
,订阅Topic以及对应Tag的规则要一致,因为Consumer
均摊消息,如果订阅逻辑不一致,可能导致丢消息。
# Group
一个组可以订阅多个Topic
# 顺序消费消息原理
通过指定消息hash,Broker
根据hash将消息推送的Consumer Group
下的同一个Consumer
上。