Java 什么决定卡夫卡消费者补偿?
我对卡夫卡比较陌生。我已经用它做了一些实验,但是关于消费者补偿,有一些事情我还不清楚。根据我到目前为止的理解,当耗电元件启动时,它将开始读取的偏移量由配置设置Java 什么决定卡夫卡消费者补偿?,java,apache-kafka,kafka-consumer-api,distributed-computing,Java,Apache Kafka,Kafka Consumer Api,Distributed Computing,我对卡夫卡比较陌生。我已经用它做了一些实验,但是关于消费者补偿,有一些事情我还不清楚。根据我到目前为止的理解,当耗电元件启动时,它将开始读取的偏移量由配置设置auto.offset.reset(如果我错了,请纠正我) 现在假设主题中有10条消息(偏移量为0到9),一个消费者恰好在消息停止之前(或在我杀死消费者之前)消费了其中的5条消息。然后,假设我重新启动消费者流程。我的问题是: 如果auto.offset.reset设置为earlime,它是否总是从偏移量0开始消耗 如果auto.offse
auto.offset.reset
(如果我错了,请纠正我)
现在假设主题中有10条消息(偏移量为0到9),一个消费者恰好在消息停止之前(或在我杀死消费者之前)消费了其中的5条消息。然后,假设我重新启动消费者流程。我的问题是:
auto.offset.reset
设置为earlime
,它是否总是从偏移量0开始消耗
auto.offset.reset
设置为latest
,它将从偏移量5开始消耗吗
如果我的问题中有什么不清楚的地方,请不要犹豫发表评论。这比你描述的要复杂一些。
只有当您的消费者组在某个地方没有提交有效的偏移量时(现在支持的两个偏移量存储是Kafka和Zookeeper),才会生效,这还取决于您使用的消费者类型 如果您使用高级java使用者,请想象以下场景:
group1
中有一名消费者已消费了5封邮件并死亡。下次启动此消费程序时,它甚至不会使用该auto.offset.reset
config,并将从其停止的位置继续,因为它只会从偏移存储中获取存储的偏移量(如我所述的Kafka或ZK)
group2
中启动了一个消费者。任何地方都没有存储偏移量,这一次,auto.offset.reset
config将决定是从主题的开头(最早的
)还是从主题的结尾(最新的
)开始
最早
和最新
配置相对应的另一个因素是日志保留策略。假设您有一个保留时间配置为1小时的主题。你发了5条信息,一小时后又发了5条。最新的
偏移量仍将与前一示例中的相同,但最早的
偏移量将不能是0
,因为卡夫卡将已经删除这些消息,因此最早的可用偏移量将是5
上面提到的所有内容都与SimpleConsumer
无关,每次运行它时,它都会决定从何处开始使用auto.offset.reset
config
如果您使用的卡夫卡版本早于0.9,则必须将
最早的
,最新的
替换为最小的
,最大的
,只是一个更新:从卡夫卡0.9和更高版本开始,卡夫卡正在使用新的Java版本的使用者,并且auto.offset.reset参数名称已更改;从手册中:
如果卡夫卡中没有初始偏移或当前
服务器上不再存在偏移量(例如,因为该数据
已删除):
最早的:自动将偏移重置为最早的偏移
最新:自动将偏移重置为最新偏移
none:如果未找到以前的偏移量,则向使用者抛出异常
针对消费者群体
其他:向消费者抛出异常
在检查了已接受的答案后,我花了一些时间找到了这个答案,因此我认为社区发布它可能会有用。此外还有offset.retention.minutes。如果自上次提交后的时间是>
偏移量.保留时间.分钟
,那么自动偏移量.重置
也会起作用非常感谢您的回答。对于高级消费者来说,一旦消费者做出了承诺(在ZK或Kafka中),那么auto.offset.reset
此后就没有任何意义了?该设置的唯一意义在于没有任何承诺(理想情况下是在消费者首次启动时)?与您完全一样described@serejja您好-如果我总是每个组有一个消费者,并且您的答案中的场景1出现在我身上,那又如何?还是一样吗?@ha9u63ar不太明白你的问题。如果在同一组中重新启动消费者,则是,它将不会使用auto.offset.reset
并从提交的偏移量继续。如果您总是使用不同的消费者组(如启动消费者时生成它),那么消费者将始终遵守auto.offset.reset
@serejja yes,这对我不起作用。你能看一下吗?这是我的问题。这看起来与日志保留无关吗?设置保留是否应该基于日志保留?@mike01010是的。它应该以日志保留为基础,这是本文建议的解决方案之一将offset.retention.minutes的默认值延长到至少是log.retention.hours的两倍。
这个答案让我害怕了一段时间,直到我检查了offset.retention.minutes
:消费者组失去所有消费者后(即变为空)其偏移量将在此保留期内保留,然后丢弃。对于独立使用者(使用手动分配),偏移量将在上次提交时间加上此保留期后过期。(这是针对《卡夫卡2.3》)被接受的答案是用新名字写的-这个答案没有提供任何独特之处,是吗?(如果在写这篇文章的时候它没有90张赞成票,我建议删除它。)令人惊讶的是,很多人发现它很有用