Xiaomi Galaxy Talos Book

Talos数据消费模型图解


数据消费

Talos的高级Consumer为用户解决了数据消费的很多问题,其中一点就是“有记忆”的消费,保证用户在启动Consumer的时候能从“上次消费过”的地方开始消费;

message consuming

  • Commit Offset:TalosConsumer运行过程中,会不定时的对用户已经消费过的数据进行commit,我们叫做‘commit offset’,含义就是提交到server端记录已经消费的offset,请注意Commit Offset并不是每一条都Commit,而是以batch为单位进行commit,决定commit的时机有两个维度,‘时间’和‘消费的消息量’,用户是可以进行配置的;

如图所示,我们以 Partition 7 的 file 3 为例,假设用户第一次启动了TalosConsumer,运行一段时间退出了,退出之前最后一次commit offset提交的是700,这个时候程序挂掉了,用户重启了程序,这时候TalosConsumer会去询问Server它上次消费到哪里了,它会知道自己上次消费到700了,于是程序会从701开始读取数据;用户读取了一个batch的消息,假设一共是200条消息,TalosConsumer会查看这个batch的消息中最大的offset是多少,读取200条最后一条的offset是900,此时TalosConsumer会将900 commit到server端,通过这样的方式实现“有记忆”的消费;

注意:如图表所示,每个consumer group都记录自己对某个partition消费的offset记录,不同的consumer group是可以消费同一个partition的,而它们各自消费的offset记录是单独维护的;如表,consumer group 1对Partition 7消费的offset记录是900,而consumer group 2记录的是100;

重置Offset

从上面我们知道TalosConsumer重启后会从上次消费过的地方继续读取数据,但是有的用户需求会不一样,如果希望重启客户端程序的时候从头或从末尾开始读取怎么办?Talos提供配置允许用户重启程序时从不同的位置开始消费。

offset reset

在说明如何重置offset之前,先介绍一些概念:

  • Start Offset:当前Partition中有效数据的起始offset,如图Partition 7开始的StartOffset是file 1中的第一条消息,offset是0,故Partition 7的StartOffset是0;假设Topic数据保留1天,一天后file 1 expired了,此时Partition 7的有效文件是从file 2开始的,Partition 7的StartOffset就变成了380;

  • Last Commit Offset:上面说过,这里不赘述

  • End Offset:当前Partition中有效消息的最后一条,如图所示,Partition 7的最后一条消息offset是1000,即End Offset是1000;

无论是第一次启动TalosConsumer还是后续的重启,每一次启动程序时,用户都可以通过修改配置将读取起始offset进行重置,关于如何进行重置,请参见TalosConsumer API中的配置说明关于重置offset的注释,这里说一下TalosConsumer读取消息的默认情况:

  • 第一次启动时,默认从Start Offset开始读取(可能是0,也可能是expired后更新的offset)

  • 后续重启时,默认从Last Commit Offset开始读取(可能因为消息expired导致Last Commit Offset无效,这种情况请参见配置说明中的场景4