一尘不染

是什么决定了卡夫卡的消费者补偿?

java

我对Kafka比较陌生。我已经做了一些实验,但是对于消费者补偿我有些不清楚。根据到目前为止的了解,使用方启动时,将从其读取的偏移量由配置设置确定auto.offset.reset(如果我输入错了,请更正我)。

现在说,例如,该主题中有10条消息(偏移量0到9),一个消费者在崩溃之前(或我杀死该消费者之前)碰巧消耗了其中的5条消息。然后说我重新启动该使用者进程。我的问题是:

  1. 如果将auto.offset.reset设置为smallest,它是否总是从偏移量0开始消耗?

  2. 如果将auto.offset.reset设置为largest,它将从偏移量5开始消耗吗?

  3. 关于这种情况的行为是否总是确定性的?

如果我的问题不清楚,请随时发表评论。提前致谢。


阅读 254

收藏
2020-09-09

共1个答案

一尘不染

它比您描述的要复杂一些。
auto.offset.reset只有当您的消费群没有一个有效的抵消承诺某处配置踢腿(现2个支持偏移存储器是卡夫卡和动物园管理员),而且还依赖于某种消费的你用什么。

如果您使用高级Java使用者,请设想以下情形:

  1. 您在某个消费群体group1中有一个消费了5条消息并死亡的消费者。下次启动该使用者时,它甚至不会使用该auto.offset.reset配置,并且将从死亡的位置继续,因为它将仅从偏移存储(如我所提到的,Kafka或ZK)中获取存储的偏移。

  2. 您在主题中有消息(如您​​所述),并且在新的使用者组中启动了使用者group2。没有偏移量存储在任何地方,这次auto.offset.reset配置将决定是从主题的开头(earliest)还是从主题的结尾(latest)开始

影响保留值earliestlatest配置对应的另一件事是日志保留策略。想象一下,您有一个保留时间配置为1小时的主题。您产生5条消息,然后一个小时后又发布5条消息。该latest偏移将仍然相同,前面的例子,但earliest一个不能是0因为卡夫卡都已经删除这些消息,并因此最早可偏移会5

上面提到的所有内容都不相关,SimpleConsumer并且每次运行它都将决定从哪里开始使用auto.offset.resetconfig。

如果您使用的卡夫卡版本比0.9老,你要替换earliestlatestsmallestlargest

2020-09-09