【问题标题】:How does manual commit mode behavior change in spring kafka 2.8spring kafka 2.8中的手动提交模式行为如何变化
【发布时间】:2021-08-26 05:06:08
【问题描述】:

我注意到 spring kafka 中即将推出的功能:https://docs.spring.io/spring-kafka/docs/2.8.0-M2/api/org/springframework/kafka/listener/ContainerProperties.html#setAsyncAcks(boolean)

我的问题是,如果我的提交模式是 MANUAL(而不是 MANUAL_IMMEDIATE),那并不总是意味着 ack 是异步处理的(不是立即)吗?

手动状态的当前文档

MANUAL:消息侦听器负责确认()确认。之后,应用与 BATCH 相同的语义。

在我看来,在确认 BATCH 中的所有记录之前,提交永远不会发生。当前行为是什么(或者如果 asyncAcks 设置为 false 会是什么行为)?

问题 2:假设我被困在 spring kafka 2.7 领域:我有一个侦听器,它为另一个主题生成消息。在侦听器成功生成消息之前,我不希望提交偏移量。确保这一点的自然方法是在 kafkaTemplate.send 调用返回的 ListenableFuture 中的 onSuccess 方法中发送 ack。

但是看到 2.7 似乎不支持乱序确认,我想知道这是否真的是一种安全的方法。

【问题讨论】:

    标签: spring-kafka


    【解决方案1】:

    异步处理记录通常是不安全的,因为偏移量可能会乱序提交。

    2.8 功能通过在存在“差距”时推迟提交来支持这一点。

    使用 MANUAL_IMMEDIATE 时,如果提交填补了空白,则在此之前应用待处理的提交。对于 MANUAL,使用相同的方法;就在下一次轮询之前,应用任何提交(最多一个间隙,如果存在)。如果仍有未提交的偏移量(因为它们尚未被确认),则消费者将暂停,因此不会有新记录到达,直到处理完之前轮询的所有剩余未决提交。

    https://docs.spring.io/spring-kafka/docs/2.8.0-M2/reference/html/#ooo-commits

    手动提交偏移量

    通常,当使用AckMode.MANUALAckMode.MANUAL_IMMEDIATE时,必须按顺序确认确认,因为Kafka不维护每条记录的状态,只有每个组/分区的已提交偏移量。从版本 2.8 开始,您现在可以设置容器属性 asyncAcks,这允许以任何顺序确认对轮询返回的记录的确认。侦听器容器将推迟无序提交,直到收到丢失的确认。消费者将被暂停(不提供新记录),直到前一次轮询的所有偏移量都已提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2018-05-05
      • 2017-09-10
      • 2020-09-08
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多