【问题标题】:What happens when during manual commit specific offset fails but next offsets in sequence commits successfully?当手动提交特定偏移量失败但序列中的下一个偏移量成功提交时会发生什么?
【发布时间】:2019-09-08 09:11:34
【问题描述】:

我正在使用轮询机制编写一个 kafka 消费者,每次轮询我会收到 100 条消息。消费完消息后,我一一手动提交偏移量。在提交偏移量时,有时我会在 100 条消息中收到一条错误消息。剩余偏移量提交成功。

Offsets
1,2,3,4,5,6,7,....100

假设偏移量 5 提交失败,但不包括偏移量 5,所有偏移量都成功提交。

那么,在这种情况下,提交失败的偏移量会发生什么?由于偏移量是按顺序移动的,我会在下次轮询中得到提交失败的偏移量吗?

我的主要调查显示它在下一次投票中读取了失败的偏移量。需要专家对此的看法。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    不需要单独提交每个偏移量。如果您提交偏移量X,则意味着所有较小的偏移量也都已提交。

    【讨论】:

    • 请注意,我是有意手动提交每个偏移量的。因此,如果提交了偏移量 x,则不需要提交所有较小的偏移量。
    • 好吧。 “我故意手动提交每个偏移量”——不建议这样做,因为它会给经纪人带来高负荷。同样 i,f offset X get 的提交,它意味着所有较小的偏移量都已提交,您无法阻止。这就是卡夫卡的工作原理。
    • 假设我们将自动提交设置为true,并且我们在消费消息后所做的消息处理失败,那么我们将无法再次消费相同的消息。根据保留策略,它将在那里,但为此我们必须记录失败的消息偏移量。这就是我对自动提交策略的感受。你有什么意见?
    • 如果处理失败,您可以使用seek()重新阅读消息。这有帮助吗?另外,我同意你经常不想使用自动提交。但是,即使您使用自动提交,通常也不需要提交每条消息。
    • @MatthiasJ.Sax 在我的一个项目中,用例是使用数据,执行一些操作并将其生成到新主题。我想在成功操作后手动提交偏移量以避免任何数据丢失,为此在编码中我使用 (autoCommit: false) 和 (consumer.commitOffsets) 手动提交偏移量。正如您所指出的,我们不需要提交每个偏移量 bcz 它会在代理上产生负载,那么我可以遵循的最佳方法是什么来避免任何数据丢失?请指教
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2019-07-05
    相关资源
    最近更新 更多