RocketMQ——客户端篇:Producer/Consumer的实例对象

来源:互联网 发布:范雎怎么读sui 知乎 编辑:程序博客网 时间:2024/05/22 03:08

调用MQClientInstance.start方法启动MQClientInstance对象;大致逻辑如下:

1、检查MQClientInstance.ServiceState的状态(初始化状态为ServiceState.CREATE_JUST);只有状态为CREATE_JUST时才启动该Producer;其他状态均不执行启动过程;

2、将MQClientInstance的ServiceState置为start_failed,以免重复启动;

3、检查是否设置了NameServer的地址(在启动Producer之前在应用层设置ClientConfig.namesrvAddr),若没有则从地址服务器找Name Server地址,地址服务器的路径是"http://" +WS_DOMAIN_NAME+":8080/rocketmq/"+WS_DOMAIN_SUBGROUP;其中WS_DOMAIN_NAME为system.property配置参数rocketmq.namesrv.domain的值,WS_DOMAIN_SUBG为system.property配置参数rocketmq.namesrv.domain.subgroup的值;

4、调用MQClientAPIImpl.start方法:首先调用MQClientAPIImpl. remotingClient方法,启动Netty客户端;然后以PROJECT_CONFIG为NameSpace,本地IP为key值向NameServer发送GET_KV_CONFIG请求,获取前缀赋值给MQClientAPIImpl.projectGroupPrefix变量;

5、设置各类定时任务:

5.1)若Name Server地址(ClientConfig.namesrvAddr)为空,则设置定时获取Name Server地址,每隔120秒从地址服务器查找Name Server地址;

5.2)每隔30秒调用一次MQClientInstance.updateTopicRouteInfoFromNameServer()方法更新topic的路由信息;

5.3)每隔30秒进行一次清理离线的Broker的工作。遍历MQClientInstance.brokerAddrTable的值,对于不在MQClientInstance.topicRouteTable中的Broker地址,从brokerAddrTable中清理掉;

5.4)每隔30秒调用一次MQClientInstance.sendHeartbeatToAllBrokerWithLock()方法,在该方法中,第一,向所有在MQClientInstance.brokerAddrTable列表中的Broker发送心跳消息;第二,向Filter过滤服务器发送REGISTER_MESSAGE_FILTER_CLASS请求码,更新过滤服务器中的Filterclass文件;

5.5)每隔5秒调用一次MQClientInstance.persistAllConsumerOffset()方法。将每个Consumer端的消费进度信息向Broker同步(详细步骤见4.2.2小节),只有Consumer端才会进行同步;Producer端不发起同步;

5.6)定期每1毫秒执行一次MQClientInstance.adjustThreadPool()方法检测并调整PUSH模式(DefaultMQPushConsumer)下ConsumeMessageService对象中线程池的线程数)。该ConsumeMessageService类有两个子类ConsumeMessageConcurrentlyService和ConsumeMessageOrderlyService,分别表示并发消费和顺序消费两类情况,这两个之类的adjustThreadPool方法是一样的,在此,以ConsumeMessageConcurrentlyService对象为例,在初始化ConsumeMessageConcurrentlyService对象的过程中利用DefaultMQPushConsumer.consumeThreadMax和DefaultMQPushConsumer. consumeThreadMin初始化consumeExecutor线程池。在该方法中遍历MQClientInstance.consumerTable:ConcurrentHashMap<String/* group */, MQConsumerInner>变量,若MQConsumerInner为DefaultMQPushConsumerImpl,则调用DefaultMQPushConsumerImpl.adjustThreadPool()方法,在该方法中,首先汇总DefaultMQPushConsumerImpl.RebalanceImpl.processQueueTable中所有ProcessQueue对象的msgAccCnt值(即表示Broker端未消费的逻辑队列大小);由DefaultMQPushConsumer.adjustThreadPoolNumsThreshold参数设置阀值,默认为100000;

若汇总的msgAccCnt值大于adjustThreadPoolNumsThreshold值,并且ConsumeMessageConcurrentlyService.consumeExecutor的当前线程数量小于最大线程数,则将当前线程数量加1;

若汇总的msgAccCnt值小于adjustThreadPoolNumsThreshold*0.8,并且ConsumeMessageConcurrentlyService.consumeExecutor的当前线程数量大于最小线程数,则将当前线程数量减1;

6、启动PullMessageService服务线程,该服务监听PullMessageService.pullRequestQueue:LinkedBlockingQueue<PullRequest>队列,若该队列有拉取消息的请求,则选择Consumer进行消息的拉取,该定时服务是Consumer使用的;

7、启动RebalanceService服务线程,该服务是Consumer端使用的;

8、启动在初始化MQClientInstance对象过程中初始化的DefaultMQProducer对象,即调用内部初始化的DefaultMQProducer对象的DefaultMQProducerImpl.start(false)方法,参数为false表示在启动该Producer对象的内部不启动MQClientInstance;

9、设置MQClientInstance的ServiceState为RUNNING;

阅读全文
0 0
原创粉丝点击