消费者生产的时候,须要指定去生产哪个Topic的音讯,比方TopicTest。
和生产者一样,消费者也须要去NameServer拉取TopicTest对应的元数据信息。
如上图所示,TopicTest对应这两个broker,每个broker都有两个MessageQueue,那消费者从哪里拉取数据呢?
比方咱们有两个消费者,消费者在启动的时候,会向每个broker发送心跳包,这样每一个broker都有消费者的信息,咱们也能够从任意一个broker获取所有消费者的信息。
既然有了元数据信息,还有消费者的信息,那就能够通过调配算法,晓得以后这个消费者去哪个MessageQueue拉取数据。
目前RocketMQ默认提供6种调配算法,包含平均分配(AllocateMessageQueueAveragely)、均匀轮询调配(AllocateMessageQueueAveragelyByCircle)、一致性hash(AllocateMessageQueueConsistentHash)、依据配置(AllocateMessageQueueByConfig)、依据Broker部署机房名(AllocateMessageQueueByMachineRoom)、就近机房模式(AllocateMachineRoomNearby)。
默认是平均分配,比方有4个MessageQueue,那两个消费者各2个。消费者1调配的是MessageQueue0和MessageQueue1,消费者2调配MessageQueue2和MessageQueue3。
如果是均匀轮询调配,那消费者1调配1个,消费者2调配1个,消费者1再调配一个,消费者2再调配一个,最终消费者1调配的是MessageQueue0和MessageQueue2,消费者2调配MessageQueue1和MessageQueue3。
咱们接着平均分配进行往下说,以消费者1为例。
此时曾经晓得消费者从MessageQueue0和MessageQueue1来生产,那从哪里开始生产呢?
生产的模式又分为从队列最新偏移量开始生产(CONSUME_FROM_LAST_OFFSET)、从头开始生产(CONSUME_FROM_FIRST_OFFSET)、从消费者启动的工夫戳对应的生产进度开始生产(CONSUME_FROM_TIMESTAMP)。
依据以上的信息,咱们就能够整合一个申请信息PullRequest,包含生产组、偏移量、MessageQueue、ProcessQueue(这个前面来解释),寄存在pullRequestQueue链表里。