rocketMQ版本:4.5.2

本次只是简单从rocketmq example里quickstart的producer例子进入,了解下消息发送的一个简单流程,一些比较复杂的流程会在后续学习中继续以新文章记录。

RocketMQTemplate 发送消息带多个tag_客户端


首先,从例子中可以看到要先启动producer。进入start方法,查看相应的启动流程。

RocketMQTemplate 发送消息带多个tag_rocketMQ_02

----- DefaultMQProducerImpl start

继续进入DefaultMQProducerImpl的start方法。

RocketMQTemplate 发送消息带多个tag_客户端_03


由此可以看出,一开始会先检查一些相应的配置,点进去checkConfig()方法,可以看出其实就是在检查producerGroup是否为空,是否符合命名规则,,是否等于默认的producerGroup。

RocketMQTemplate 发送消息带多个tag_消息发送_04


之后,获取mq客户端实例。

RocketMQTemplate 发送消息带多个tag_rocketMQ_05


RocketMQTemplate 发送消息带多个tag_消息发送_06

简单跟进去看一下客户端实例如何获取的。

RocketMQTemplate 发送消息带多个tag_发送消息_07

RocketMQTemplate 发送消息带多个tag_消息发送_08


可以看到clientId的命名规则是"客户端ip@实例名",所以猜测将实例名改为进程id,则同一个客户端可以启动多个producer实例。

同时可以简单看一下MQClientInstance里的一些属性,大致了解下具体有哪些即可。

RocketMQTemplate 发送消息带多个tag_rocketMQ_09


获取客户端实例后,就是将producer注册到该客户端实例中,从上图我们可以看到MQClientInstance有用于缓存生产组的数据结构。注册即将该producerGroup保存到producerTable中。

RocketMQTemplate 发送消息带多个tag_客户端_10


RocketMQTemplate 发送消息带多个tag_客户端_11

----- MQClientInstance start

之后就是启动客户端实例。

RocketMQTemplate 发送消息带多个tag_发送消息_12


客户端实例启动主要是启动一些定时任务以及一些服务(拉取消息的pullMessageService以及负载均衡的rebalanceService)

RocketMQTemplate 发送消息带多个tag_消息发送_13


简单看一下startScheduledTask();

RocketMQTemplate 发送消息带多个tag_rocketMQ_14

RocketMQTemplate 发送消息带多个tag_rocketMQ_15


RocketMQTemplate 发送消息带多个tag_rocketMQ_16

一切启动完成,serviceState设为RUNNING

RocketMQTemplate 发送消息带多个tag_客户端_17

再次回到producer例子里,启动完producer,就可以发送消息了。

RocketMQTemplate 发送消息带多个tag_消息发送_18

-----DefaultMQProducerImpl send

RocketMQTemplate 发送消息带多个tag_发送消息_19

-----DefaultMQProducerImpl sendDefaultImpl

(一些简单的检查就不继续截图出来了,下图注释会标明具体都是检查哪一些内容)

RocketMQTemplate 发送消息带多个tag_消息发送_20


选择某个队列进行消息发送

RocketMQTemplate 发送消息带多个tag_发送消息_21


一些具体的细节,如如何获取topic路由、如何选择要发送的队列等可以看我的上一篇博文这里我们选择看同步发消息的逻辑:

RocketMQTemplate 发送消息带多个tag_消息发送_22

RocketMQTemplate 发送消息带多个tag_rocketMQ_23


从这里可以看出来,rocketmq发送消息时,是会对比较长的消息进行压缩的。

RocketMQTemplate 发送消息带多个tag_消息发送_24


发送消息

RocketMQTemplate 发送消息带多个tag_消息发送_25

-----MQClientAPIImpl sendMessage

RocketMQTemplate 发送消息带多个tag_发送消息_26


RocketMQTemplate 发送消息带多个tag_客户端_27


这里就是构造一个发送消息的请求,然后将消息发送给broker,具体的如何发送就等之后另起一篇来学习。

整个消息发送流程大致就是这样的,producer启动,客户端实例启动,期间会检查一些相应配置,启动一些服务和定时任务,消息发送时要去nameserver获取topic的路由信息,需要按一定机制选择可以发送的队列,然后将消息发送到broker上。