6)负载均衡
首先要弄清楚一个问题,啥是集群消费,这里假设单台机器对应一个jvm进程,且只包含一个clientId,其实一个jvm进程,可以包含多个clientId,多个clientId意味着多个客户端实例MQClientInstance;
多台机器都订阅了同一个主题,但该主题又分配在了不同broker的queue中,所以需要将每个主题对应的这些不同broker上的queue收集到集合set中,再将该set平均分配给不同机器;
负载均衡指将messageQueue分配给不同的clientId,通常一个clientId对应一台机器;这和生产者发消息很相似,生产者是轮询选择一个messageQueue发送;
集群中每个机器代码都一样,订阅同一个topic的所有机器(clientId不同)都是一样的业务处理逻辑,所以每个机器分别处理一部分消息,最终目的都是入库落表;
6.1)rebalanceService线程的run方法
调用countDownLatch的await方法,进行超时阻塞,时间默认20s,可配置;醒来后执行MQClientInstance#doRebalance方法,其中会遍历consumerTable,执行每个消费者组下的RebalanceImpl#doRebalance方法,其中又会遍历subscriptionInner表,对每个topic执行RebalanceImpl#rebalanceByTopic方法;
6.1.1)获取set
根据topic从topicSubscriptionInfoTable中获取set;
6.1.2)MQClientInstance#findConsumerIdList
根据topic——>topicRouteData——>List,最后随机选择一个主节点broker,向该broker发送rpc同步请求查询订阅了当前topic的所有clientId,请求码为RequestCode.GET_CONSUMER_LIST_BY_GROUP;