随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、消息的生产

Producer 可以将消息写入到某 Broker 中的某 Queue 中,其经历了如下过程:

  • Producer 发送消息之前,会先向 NameServer 发出获取消息 Topic 的路由信息的请求
  • NameServer 返回该 Topic 的路由表及 Broker 列表
  • Producer 根据代码中指定的 Queue 选择策略,从 Queue 列表中选出一个队列,用于后续存储消息
  • Produer 对消息做一些特殊处理,例如,消息本身超过 4M,则会对其进行压缩
  • Producer 向选择出的 Queue 所在的 Broker 发出 RPC 请求,将消息发送到选择出的 Queue

消息 Topic 路由表:

  • 实际是一个 Map,key 为 Topic 名称,value 是一个 QueueData 实例列表。
  • QueueData 并不是一个 Queue 对应一个 QueueData,而是一个 Broker 中该 Topic 的所有 Queue 对应一个 QueueData。即,只要涉及到该 Topic 的 Broker,一个 Broker 对应一个 QueueData。
  • QueueData 中包含 brokerName。简单来说,路由表的 key 为 Topic 名称,value 则为所有涉及该 Topic 的 BrokerName 列表。

Broker 列表:

  • 其实际也是一个 Map。key 为 brokerName,value 为 BrokerData。
  • 一个 Broker 对应一个 BrokerData 实例,对吗?不对。一套 brokerName 名称相同的 Master-Slave 小集群对应一个 BrokerData。
  • BrokerData 中包含 brokerName 及一个 map。该 map 的 key 为 brokerId,value 为该 broker 对应的地址。brokerId 为 0 表示该 broker 为 Master,非 0 表示 Slave。

二、Queue 选择算法

对于无序消息,其 Queue 选择算法,也称为消息投递算法,常见的有两种:

轮询算法

默认选择算法。该算法保证了每个 Queue 中可以均匀的获取到消息。

该算法存在一个问题:由于某些原因,在某些 Broker 上的 Queue 可能投递延迟较严重。从而导致 Producer 的缓存队列中出现较大的消息积压,影响消息的投递性能。

最小投递延迟算法

该算法会统计每次消息投递的时间延迟,然后根据统计出的结果将消息投递到时间延迟最小的 Queue。

如果延迟相同,则采用轮询算法投递。该算法可以有效提升消息的投递性能。

该算法也存在一个问题:消息在 Queue 上的分配不均匀。投递延迟小的 Queue 其可能会存在大量的消息。而对该 Queue 的消费者压力会增大,降低消息的消费能力,可能会导致 MQ 中消息的堆积。

posted on   格物致知_Tony  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
历史上的今天:
2019-07-31 CSS 案例
2019-07-31 CSS 总结 [目录]
点击右上角即可分享
微信分享提示

目录导航