RocketMQ-生产消息

本文主要介绍了RocketMQ生产消息的核心类及步骤。首先讲解了MQProducer、DefaultMQProducer及其内部实现类DefaultMQProducerImpl和TopicPublishInfo的角色。接着阐述了生产消息的两个核心步骤:获取路由信息和选择合适队列。在选择队列时,详细描述了默认策略和延迟策略的执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、生产消息核心类

       生产消息的用到的几个常见类:

      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) 如何还没有找到,使用默认策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值