RocketMQ(七)——消息的生产

1.消息的生产过程

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

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

路由表:实际是一个Map,key为Topic名称,value是一个QueueData实例列表,并不是一个Queue对应一个QueueData,而是一个Broker中该Topic的所有Queue对应一个QueueData。

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

2.Queue选择算法

对于无序消息,其Queue选择算法,也称为消息投递算法,常见的有两种:
轮询算法
默认选择算法。该算法保证了每个Queue中可以均匀的获取到消息

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

最小投递延迟算法
该算法会统计每次消息投递的时间延迟,然后根据统计出的结果将消息投递到时间延迟最小的Queue。如果延迟时间相同,则采用轮询算法投递。该算法可以有效提升消息的投递性能。

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

你可能感兴趣的:(RocketMQ(七)——消息的生产)