3.2.5分区信息对象的偏移量
在结束本节之前,我们来看一下分区信息对象的偏移量在拉取钱程中的使用方式。消费者的拉取线程第一次拉取消息时,会从ZK中读取fetchedOffset来决定要从分区的哪个位置开始拉取消息。消费者在读取到消息后,会更新分区的consuMedOffset。同时,消费者也会使用consuMedOffset作为分区的消费进度并定时地提交到ZK中。
注意:但并不是说拉取线程每次拉取消息都要读取ZK的偏移量作为fetchedOffset(那样和ZK交互就太频繁了)。因为客户端已经保存了consuMedOffset来表示消息的消费进度,所以拉取线程在正常的拉取工作过程中,会直接读取本地的consuMedOffset作为下一次的fetchedOffset,并且会在读取到消息后更新consuMedOffset。通过这种方式,fetchedOffset和consuMedOffset不断交替更新,消费者就能不断读取到新的消息。
如图3-17所示,分区信息对象的偏移盘在拉取线程中起到很重要的作用,具体步骤如下。
(1)关闭拉取线程时提交consuMedOffset偏移量到ZK。
(2)重新启动拉取线程时读取ZK中的偏移量。
(3)将ZK的偏移量作为刚开始的fetchedOffset。
(4)客户端读取到消息后会更新consumedOffset。
(5)在这之后每次拉取使用的fetchedOffset都来向于最新的consumedOffset。
(6)客户端进程定时提交偏移i注和(l)类似,也是取consuMedOffset写到ZK中。
总结一下消费者客户端使用消费者连接器的主要工作,具体步骤如下。
(1)创建队列和消息流,前者用于保存消费者拉取的消息,后者会读取消息。
(2)注册各种事件的监昕器,当事件发生时,消费组所有消费者成员都会再平衡。
(3)再平衡会为消费者重新分配分区,并构造分区信息加入topicRegistry。
(4)拉取线程获取topicRegistry中分配给消费者的所有分区信息、开始T作。