一、生产消息核心类
生产消息的用到的几个常见类:
1、MQProducer:消息生产者对外接口,内部定义允许用户调用的服务接口,如单条发送与批量发送等接口定义
2、DefaultMQProducer:MQProducer默认实现类和生产者配置信息
3、DefaultMQProducerImpl:消息生产逻辑实际包装类,获取路由、选择broker与发送消息具体逻辑都在此类
4、TopicPublishInfo:记录可以接受该topic的broker信息和队列信息。一个topic可以被多个broker接口,每个broker可有多个队
列,内部的messageQueueList记录了可接受消息的队列,这些队列可能属于多个broker。
二、核心步骤
1、获取路由信息
DefaultMQProducerImpl.topicPublishInfoTable记录客户端所有topic主题的路由信息,相当本地缓存。从topicPublishInfoTable中查找topic的路由信息,有则直接返回,没有则请求nameserv获取topic路由,并保存到本地缓存中。
2、选择合适队列
找到后会从topicPublishInfoTable中选择合适的队列,选择策略有两个。默认是遍历所有队列,按照列表顺序取出,但本次与上次取出的不能在同一个broker下。知道选出合适的队列。例如有三个broker,每个broker分别有三个写队列,分别记作b1_q1,b1_q2,b1_q3,b2_q1,b2_q2,b2_q3,b3_q1,b3_q2,b3_q3,topicPublishInfoTable中的列表顺序与该顺序一致,如果上一次选择b1_q2,序号是1,则本次先选出b1_q3,但该队列与上一次发送队列在统一个broker,因此会向下查找到b2_q1,该队列满足规则直接返回,但此时记录的序号是2。当再有发送请求时,会先查找序号威3的队列,既b2_q1,但该队列有上一次选择队列在同一个broker,因此会继续查找,直到找到满足条件的队列b3_q1。
sendLatencyFaultEnable=true时开启延迟策略,选择发送时间最短的broker。DefaultMQProducerImpl记录每个broker发送时间耗时的列表,消息发送成功或者失败后都会更新列表,记下本次发送broker所用时间。消耗时间越长后面被选择的概率越低。
延迟策略选择的步骤是:
(1)先选择可用的broker,如果有就直接返回。
(2)没有就从耗时列表中找出一个耗时相对较少的broker,然后从messagequeue中找出一个队列,把这个队列的broker名称改为选出的broker,queueid也重新赋值,然后返回
(3) 如何还没有找到,使用默认策略