RocketMQ__NameSever
作者:互联网
NameServer 架构设计
消息中间件的设计思路一般基于主题的订阅发布机制,消息生产者( Producer )发送某 主题的消息到消息服务器,消息服务器负责该消息的持久化存储,消息消费者(Consumer)订阅感兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者( PUSH 模式)或者消息消费者主动向消息服务器拉取消息( PULL 模式),从而实现消息生产者与消息消费者解调,为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。
Broker 消息服务器在启动时向所有 Name Server 注册,消息生产者(Producer)在发送消息之前先从 Name Server 获取 Broker 服务器地址列表,然后根据负载算法从列表中选择一台消息服务器进行消息发送 NameServer 与每台Broker 服务器保持长连接,并间隔 30sBroker 是否存活,如果检测到 Broker 从路由注册表中将其移除 但是路由变化不会马上通知消息生产者,这是为了降低 NameSever 实现的复杂性,在消息发送端提供容错机制来保证消息发送的高可用性。
NameServer 本身的高可用可通过部署多台 Names rver 服务器来实现,但彼此之间互不通信,也就是 NameServer 务器之间在某一时刻的数据并不会完全相同,但这对消息发送不会造成任何影响,
订阅发布机制,集群部署,长连接,30S检测,2min提出
启动流程
- 首先来解析配置文件,需要填充 ameServer onfig ettyServerConfig 属性值
- 根据启动属性创建NamesrvController 实例,并初始化该实例 NameServerController实例为 NameSer飞明核心控制器。
NameServer 每隔 Os 扫描一次 Broker 移除处于不激活状态的 Broker
names rver 每隔 10 分钟打印一次 KV配置
- 注册 JVM 钩子函数并启动服务器, 以便监昕 Broker 、消息生产者的网络请求
路由注册与剔除
路由元信息
- topicQueueTable
Topic 消息队列路由信息,消息发送时根据路由表进行负载均衡 - brokerAddrTable
Broker 基础信息,包含brokerName、所属集群名称、主备 Broker地址 - clusterAddrTable
Broker 集群信息,存储集群中所有 Broker 名称 - brokerLiveTable
Broker 状态信息。NameServer 每次收到心跳包时会替换该信息 - filterServerTable
Broker 上的 FilterServer 列表,用于类模式消息过滤
RocketMQ 基于订阅发布机制 一个 Topic 拥有 个消息队 ,一个 Broker 为每一主题默认创建4个读队列4个写队列,多个 Broker 组成一个集群,BrokerName 由相同的多台 Broker成 Master-Slave架构,brokerId为0代表 Master 大于0表示 Slave,BrokerLivelnfo中的lastUpdateTimestamp 存储上次收到 Broker 心跳包的时间
路由注册
心跳实现,Borker启动时向所有的NS注册,每个30S向NS发送心跳包,NS收到心跳更新brokerLiveTab缓存中BrokerLivelnfo的LastUpdateTimestamp ,NS每10S扫描brokerLiveTable,2min没有收到心跳,将移除对应的Borker路由信息同时关闭Socket连接。
RocketMQ 网络传输基于Netty
路由注册需要加写锁 ,防止并发修改 RoutelnfoManager 中的路由.
路由删除
RocktMQ 两个触发点来触发路由删除
- NameServer定时扫描 brokerLiveTable 检测上次心跳包与当前系统时间的时间差,如果时间戳大于 120s ,则需要移除 Broker 信息。
- Broker 在正常被关闭的情况下,会执行 unregisterBroker指令
由于不管是何种方式触发的路由删除,路由删除的方法都是一样的,就是从topicQueueTable、brokerAddrTable、brokerLiveTable、filterServerTable 删除与 Broker相关的信息。
标签:__,NameSever,Broker,发送,RocketMQ,服务器,NameServer,路由,消息 来源: https://blog.csdn.net/xurc1996/article/details/122424002