metaq消费者原理分析

339 阅读1分钟

consumer类图.jpg

关键类说明

MQClientInstance:
默认情况下单机启动一个MQClientInstance实例,每个实例id的格式为ip@instanceName, instanceName 默认值为DEFAULT, 在集群模式下变更为PID, 启动consumer时,可通过指定不同的instanceName,在单机模式下产生多个MQClientInstance, 从而实现consumer实例分开管理,从而更快的做consumer的负载均衡,如果使用一个MQClientInstance实例管理所有的consumer,可能导致负载均衡过程较慢(多个consumer负载均衡是串行过程)

MQClientInstance依赖的RebalanceService类实例:
该类是一个线程,随着MQClientInstance启动而启动,默认每20s执行一次,主要负责MQClientInstance实例管理的consumer实例的负载均衡,简单来说就是每20s触发一次MQClientInstance实例的负载均衡,MQClientInstance实例会触发其管理的consumer依次执行负载均衡,同时该线程提供临时被唤醒机制

consumer端的负载均衡策略有如下6种

  • AllocateMessageQueueAveragely, 平均分配,比如有q1,q2,q3,q4 4个message队列,c1,c2,c3 3个消费者,则c1消费(q1,q2), c2消费q3, c3消费q4
  • AllocateMessageQueueAveragelyByCircle, 循环平均消费,同上4个message队列,3个消费者,c1消费(q1,q4),c2消费q2, c3消费q3
  • AllocateMessageQueueConsistentHash, 一致性hash算法
  • AllocateMessageQueueByConfig
  • AllocateMachineRoomNearby, 如下2种暂未研究
  • AllocateMessageQueueByMachineRoom

OffsetStore:
提供消费端进度的管理,集群消费模式的实现是RemoteBrokerOffsetStore, 广播模式的实现是LocalFileOffsetStore

PullMessageService:
从broker拉取消息的线程,当没有消息时,该线程阻塞在pullRequestQueue.taken(), 拉取线程在第一次负载均衡后触发第一次消息拉取

MQClientAPIImpl:
对远程RPC调用的封装