NameServer
- Broker 在启动时向所有 NameServer 注册
- 消息生产者在发送消息之前先从 NameServer 获取 Broker 服务器的地址列表,然后根据负载均衡算法从列表中选择一台 Broker 发送消息
- 与每台 Broker 服务器保持长连接,并间隔 10s 检测 Broker 是否存活,如果检测到宕机,则从路由表删除,但是路由信息不会马上通知生产者(为了降低 NameServer 复杂性),因此需要在消息发送端提供容错机制来保证消息发送的高可用性
- NameServer 本身的高可用可通过部署多台 NameServer 实现,每台 NameServer 都会有集群中所有 Broker 的消息,但彼此之前互不通信,虽然可能存在某一时刻多台 NameServer 服务器之间的数据不完全同步,但对消息发送不会造成重大影响,最多短暂造成消息发送不均衡
消息高可用设计
- topic 信息是存放在消费者方,定时更新
- 故障规避机制
- 发送端在自动发现主题的路由信息后,RocketMQ 默认采用轮训算法进行路由的负载均衡。也支持自定义的队列负载均衡算法,但要注意使用自定义的负载均衡算法后,RocketMQ 的重试机制将失效。
- RocketMQ 在任务发送失败后默认会重试两次
- 当消息第一次发送失败时,如果下一次消息还是刚刚发送失败的 Broker 上,大概率还是会失败,所以在重试时会尽量避开刚刚接收失败的 Broker
发送消息
读写队列
-
writeQueue的数量高于readQueue, 就说明有些queue只有写没有读,也就是说会有一部分消息永远都不会消费掉。
readQueue多于writeQueue的话,就说明有一部分consumer处在空跑的状态。
分为读写队列的目的是扩容缩容更平滑:
- 扩容:先增加 readQueue 数量,这时候 consumer 已经能关联到 queue 上,然后再修改 writeQueue