【问题标题】:Spring Kafka Consumer ACKMODE & Producer buffering for Kafka transactionsKafka 事务的 Spring Kafka Consumer ACKMODE 和 Producer 缓冲
【发布时间】:2020-03-12 00:47:09
【问题描述】:

我需要使用消费过程生产模式来处理 Kafka 消息,并配置了一个带有 Kafka 事务管理器的 Spring Kafka 侦听器容器,并且还设置了 transaction-id-prefix 以启用 Kafka 事务。我正在使用 BATCH 的确认模式,并试图了解偏移量何时在此模式下通过事务实际提交。文档似乎表明,一旦轮询中的所有记录都已被使用,ack-mode BATCH 就会提交偏移量 - 在事务上下文中也是如此,即每个轮询 1 个事务?

或者在使用 Kafka 事务(每个侦听器调用 1 个事务)时忽略 ack-mode BATCH?是这样,考虑到消费者需要为每条读取的记录与代理交谈,它对消费者性能的影响有多大?这是否也意味着我的响应生产者不能再缓冲记录并将它们分批发送给代理,并且我失去了生产者的异步性?

很抱歉在同一个帖子中提出了多个问题(可能太多了)。

【问题讨论】:

    标签: spring-kafka kafka-producer-api


    【解决方案1】:

    在使用事务时根本不使用 AckMode。记录的偏移量在侦听器退出时和事务提交之前发送。

    您可以通过使用批处理侦听器来改进事情,您可以在一次调用中获取List<> 中的所有记录。

    但是,为了正确支持生产者防护,您还应该将subBatchPerPartition(在 2.3.2 中添加)设置为 true,以便我们为 poll() 返回的每个 topic/partition 获取一个事务。

    同样,子批次的偏移量将在侦听器退出时发送。

    如果您不关心隔离,您可以在一个事务中处理整个批次。

    【讨论】:

    • 谢谢加里!一个后续查询 - 事务提交时,生产者是否会刷新批处理中处理的所有记录?因此,如果事务成功提交,我可以确定所有记录都已写入 Kafka,而无需实现生产者回调?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2020-07-10
    相关资源
    最近更新 更多