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


169

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

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

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

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

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

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

Answers:


260

它比您描述的要复杂一些。
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


3
非常感谢您的回答。因此,对于高级消费者而言,一旦消费者做出了某种承诺(无论是ZK还是Kafka),auto.offset.reset此后的意义就没有了吗?该设置的唯一意义是什么都不提交(理想情况下是在用户第一次启动时进行)?
Asif Iqbal 2015年

2
就像您所描述的一样
serejja

1
@serejja您好-如果我每组总是有1位消费者,您的答案中的censcen#1对我来说怎么样?会一样吗?
ha9u63ar

1
@ ha9u63ar不太了解您的问题。如果您在同一组中重新启动使用者,则可以,它将不使用auto.offset.reset并从已提交的偏移量继续。如果您始终使用不同的消费者组(例如在启动消费者时生成它),那么消费者将始终尊重auto.offset.reset
serejja

@serejja是的,这对我不起作用。你能看看这个吗-这是我的问题
-ha9u63ar

82

只是一个更新:从Kafka 0.9开始,Kafka使用了新的使用者Java版本,并且auto.offset.reset参数名称已更改;从手册中:

当Kafka中没有初始偏移量或服务器上不再存在当前偏移量时(例如,因为该数据已被删除),该怎么办:

最早:将偏移量自动重置为最早的偏移量

最新:自动将偏移量重置为最新偏移量

没有:如果未找到消费者组的先前偏移量,则向消费者抛出异常

其他:向消费者抛出异常。

在检查了可接受的答案之后,我花了一些时间来查找此内容,因此我认为对于社区发布该答案可能很有用。


9

更进一步的是o​​ffsets.retention.minutes。如果自上次提交以来的时间为> offsets.retention.minutes,则auto.offset.reset也开始执行


1
这对于保留日志似乎不是多余的吗?偏移保留应基于日志保留吗?
mike01010 '18

@ mike01010是的。它应该基于日志保留,这是故障单中建议的解决方案之一。Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb,

这个答案让我有些恐惧,直到我检查了文档offsets.retention.minutes:<B>后消费群体失去了所有的消费者(即变空)它的偏移量将被保留用于获取丢弃在此之前保留期限</ b>对于独立消费者(使用手动分配),则偏移量将在上次提交时间加上此保留期后过期。(这是针对Kafka 2.3
jump_monkey '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.