源码分析RocketMQ之Producer启动
DefaultMQProducerImpl 是默认的生产者实现类,接下来主要分析他的start方法
1、第一次启动serviceState状态就是CREATE_JUST状态,表示刚创建还没有启动
2、checkConfig 检查group组的合法性,如果group组不上它内部的一个CLIENT_INNER_PRODUCER
根据是否指定组名,如果没有指定设置Pid
3、创建MQClientlnstance实例
MQClientManager管理MQClientlnstance,MQClientManager单例模式,内部维护了一个ConcurrentHashMap
key为clientId value为MQClientInstance 核心方法:getOrCreateMQClientInstance 获取客户端实例
1、获取客户端ID ip@instanceName 这个instanceName 没指定就是进程号,同jvm的不同消费者、不同生产者
在启动时获取到的MQClientInstance实例都相同
2、先从map缓存中获取MQClientInstance,如果没有创建一个,通过putIfAbsent加入缓存。
MQClientInstance:封装了RocketMq网络处理API,是消息生产者( Producer)、消息消费者 (Consumer)与 NameServer、 Broker打交道的网络通道
优点:减少了客户端使用资源,一个客户端只会创建一个实例
缺点:多个Topic如果复用一个实例时,如果jvm启动了多个Producer,配置了不同的NameServer,且没有设置instanceName,unitName,那么
Producer会共用一个实例,发送的消息会路由到此实例对应的集群,没有达到想要的结果。
4、mQClientFactory 中注册生产者 producerTable 在MQClientlnstance属性,通过 putIfAbsent 按生产者组维护了一个map对象
5、添加默认Topic信息,topicPublishInfoTable key Topic , value TopicPublishInfo 的map结构。
TopicPublishInfo:
1、orderTopic 是否顺序消息
2、haveTopicRouterInfo 是否有路由信息
3、messageQueueList 消息队列列表
4、sendWhichQueue 每选一次消息队列,自增+1,如果是Max 重置为0
5、topicRouteData Topic路由数据 判断路由信息是否变更,如果对象的每个属性值equals未变,未变更
1、orderTopicConf broker 的顺序配置 参数格式为:以“ ;”解析成数组,数组的每个成员是以“ :”分隔的,构成数据 “ brokerName:queueNum”
2、queueDatas 队列元数据
3、brokerDatas broker元数据
4、filterServerTable 过滤地址列表
6、selectOneMessageQueue 选择队列方法,lastBrokerName 上一次发送失败的brokerName
6、启动MQClientlnstance start方法
1、判断serviceState启动状态,如果为CREATE_JUST,设置START_FAILED 状态
2、如果nameservAddr为空,先利用GET请求获取名称服务地址,若是获取到了,则判断是否需要更新名称服务列表
以及原来的nameSrvAddr
3、启动客户端,启动netty
4、开启调度任务
1、获取nameserv地址的,每隔2分钟执行一次
2、从nameserv获取topic信息的任务,默认是30s拉取一次
3、每30s 清理一下下线的broker,发送心跳给broker
4、5s将消费offset 向broker 报告一次或者是本地持久化一下,这个是要看你是消息集群模式还是广播模式
5、1分钟调整一下线程池
5、启动拉取消息服务,这个服务主要是拉取消息请求的
6、启动rebalance服务,主要做queue的负载均衡
7、启动push服务,这里是MQClientInstance的defaultMQProducer,producerGroup为 CLIENT_INNER_PRODUCER,这里push模式的DefaultMQProducer是一个MQ内部的producer
,用于自动将重试消息发送回给Broker
7、sendHeartbeatToAllBrokerWithLock 立即发送心跳到所有的broker注册信息,上传所有的filter过滤器文件信息
8、每秒移除超时的请求,并执行异常回调 至此启动流程结束
源码分析RocketMQ之Producer启动
于 2022-06-13 22:19:23 首次发布