我对Kafka比较陌生。我已经做了一些实验,但是对于消费者补偿我有些不清楚。根据到目前为止的了解,使用方启动时,将从其读取的偏移量由配置设置确定auto.offset.reset(如果我输入错了,请更正我)。
auto.offset.reset
现在说,例如,该主题中有10条消息(偏移量0到9),一个消费者在崩溃之前(或我杀死该消费者之前)碰巧消耗了其中的5条消息。然后说我重新启动该使用者进程。我的问题是:
如果将auto.offset.reset设置为smallest,它是否总是从偏移量0开始消耗?
smallest
如果将auto.offset.reset设置为largest,它将从偏移量5开始消耗吗?
largest
关于这种情况的行为是否总是确定性的?
如果我的问题不清楚,请随时发表评论。提前致谢。
它比您描述的要复杂一些。 在auto.offset.reset只有当您的消费群没有一个有效的抵消承诺某处配置踢腿(现2个支持偏移存储器是卡夫卡和动物园管理员),而且还依赖于某种消费的你用什么。
如果您使用高级Java使用者,请设想以下情形:
您在某个消费群体group1中有一个消费了5条消息并死亡的消费者。下次启动该使用者时,它甚至不会使用该auto.offset.reset配置,并且将从死亡的位置继续,因为它将仅从偏移存储(如我所提到的,Kafka或ZK)中获取存储的偏移。
group1
您在主题中有消息(如您所述),并且在新的使用者组中启动了使用者group2。没有偏移量存储在任何地方,这次auto.offset.reset配置将决定是从主题的开头(earliest)还是从主题的结尾(latest)开始
group2
earliest
latest
影响保留值earliest和latest配置对应的另一件事是日志保留策略。想象一下,您有一个保留时间配置为1小时的主题。您产生5条消息,然后一个小时后又发布5条消息。该latest偏移将仍然相同,前面的例子,但earliest一个不能是0因为卡夫卡都已经删除这些消息,并因此最早可偏移会5。
0
5
上面提到的所有内容都不相关,SimpleConsumer并且每次运行它都将决定从哪里开始使用auto.offset.resetconfig。
SimpleConsumer
如果您使用的卡夫卡版本比0.9老,你要替换earliest,latest用smallest,largest。