rocketMQ消息发送流程

rocketMQ版本:4.5.2

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

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

----- DefaultMQProducerImpl start

继续进入DefaultMQProducerImpl的start方法。
rocketMQ消息发送流程
由此可以看出,一开始会先检查一些相应的配置,点进去checkConfig()方法,可以看出其实就是在检查producerGroup是否为空,是否符合命名规则,,是否等于默认的producerGroup。
rocketMQ消息发送流程
之后,获取mq客户端实例。
rocketMQ消息发送流程
rocketMQ消息发送流程

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

rocketMQ消息发送流程rocketMQ消息发送流程
可以看到clientId的命名规则是"客户端[email protected]实例名",所以猜测将实例名改为进程id,则同一个客户端可以启动多个producer实例。
同时可以简单看一下MQClientInstance里的一些属性,大致了解下具体有哪些即可。
rocketMQ消息发送流程
获取客户端实例后,就是将producer注册到该客户端实例中,从上图我们可以看到MQClientInstance有用于缓存生产组的数据结构。注册即将该producerGroup保存到producerTable中。
rocketMQ消息发送流程
rocketMQ消息发送流程

----- MQClientInstance start

之后就是启动客户端实例。
rocketMQ消息发送流程
客户端实例启动主要是启动一些定时任务以及一些服务(拉取消息的pullMessageService以及负载均衡的rebalanceService)
rocketMQ消息发送流程
简单看一下startScheduledTask();
rocketMQ消息发送流程

rocketMQ消息发送流程
rocketMQ消息发送流程

一切启动完成,serviceState设为RUNNING
rocketMQ消息发送流程

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

-----DefaultMQProducerImpl send

rocketMQ消息发送流程

-----DefaultMQProducerImpl sendDefaultImpl

(一些简单的检查就不继续截图出来了,下图注释会标明具体都是检查哪一些内容)
rocketMQ消息发送流程
选择某个队列进行消息发送
rocketMQ消息发送流程
一些具体的细节,如如何获取topic路由、如何选择要发送的队列等可以看我的上一篇博文

这里我们选择看同步发消息的逻辑:
rocketMQ消息发送流程

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

-----MQClientAPIImpl sendMessage

rocketMQ消息发送流程
rocketMQ消息发送流程
这里就是构造一个发送消息的请求,然后将消息发送给broker,具体的如何发送就等之后另起一篇来学习。
整个消息发送流程大致就是这样的,producer启动,客户端实例启动,期间会检查一些相应配置,启动一些服务和定时任务,消息发送时要去nameserver获取topic的路由信息,需要按一定机制选择可以发送的队列,然后将消息发送到broker上。