对于consume要达到负载均衡,一个队列同时只被一个consumer消费。
那么在consumer,必须能够感知到其他相同group下consumer节点的新增和下线、
当新增consumer的时候,会调用org.apache.rocketmq.client.impl.factory.MQClientInstance#sendHeartbeatToAllBrokerWithLock方法给所有的broker发送一个心跳信息,请求的code是 HEART_BEAT
broker的入口是org.apache.rocketmq.broker.processor.ClientManageProcessor#heartBeat
然后调用org.apache.rocketmq.broker.client.ConsumerManager#registerConsumer
broker端处理
broker端处理
public boolean registerConsumer(final String group, final ClientChannelInfo clientChannelInfo,
ConsumeType consumeType, MessageModel messageModel, ConsumeFromWhere consumeFromWhere,
final Set<SubscriptionData> subList, boolean isNotifyConsumerIdsChangedEnable) {
ConsumerGroupInfo consumerGroupInfo = this.consumerTable.get(group);//获取消费grouo组相关信息
if (null == consumerGroupInfo) {
ConsumerGroupInfo tmp = new ConsumerGroupInfo(group, consumeType, messageModel, consumeFromWhere);
ConsumerGroupInfo prev = this.consumerTable.putIfAbsent(group, tmp);
consumerGroupInfo = prev != null ? prev : tmp;
}
boolean r1 =//由于新增consumer,这里返回t