跳到主要内容

精确一次语义

ChatGPT-4o-mini 中英对照 Exactly Once Semantics

您可以为监听器容器提供一个 KafkaAwareTransactionManager 实例。当这样配置时,容器在调用监听器之前会启动一个事务。监听器执行的任何 KafkaTemplate 操作都参与该事务。如果监听器成功处理了记录(或在使用 BatchMessageListener 时处理多个记录),容器会通过使用 producer.sendOffsetsToTransaction() 将偏移量发送到事务中,然后事务管理器提交事务。如果监听器抛出异常,则事务会回滚,消费者会重新定位,以便在下次轮询时可以检索到回滚的记录。有关更多信息以及处理重复失败的记录,请参见 After-rollback Processor

使用事务可以实现精确一次语义 (EOS)。

这意味着,对于一个 read → process → write 序列,保证该 sequence 完成恰好一次。(读取和处理具有至少一次的语义)。

Spring for Apache Kafka 版本 3.0 及更高版本仅支持 EOSMode.V2

  • V2 - 也称为 fetch-offset-request fencing(自版本 2.5 起)
important

这要求代理程序的版本为 2.5 或更高。

V2 模式下,不必为每个 group.id/topic/partition 拥有一个生产者,因为消费者元数据与偏移量一起发送到事务中,代理可以使用这些信息来确定生产者是否被限制。

有关更多信息,请参阅 KIP-447

V2 之前是 BETAEOSMode 已更改以使框架与 KIP-732 对齐。