源码分析RocketMQ之Producer启动

本文详细剖析了RocketMQ DefaultMQProducerImpl的start方法,包括服务状态检查、配置校验、MQClientInstance的创建与管理、生产者注册、Topic信息处理以及MQClientInstance的启动流程,涉及心跳发送、调度任务、拉取消息等关键环节。

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

源码分析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、每秒移除超时的请求,并执行异常回调 至此启动流程结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值