精确一次语义
您可以为监听器容器提供一个 KafkaAwareTransactionManager 实例。这样配置后,容器会在调用监听器之前启动一个事务。监听器执行的任何 KafkaTemplate 操作都将参与该事务。如果监听器成功处理了记录(或在使用 BatchMessageListener 时处理了多条记录),容器会通过 producer.sendOffsetsToTransaction() 将偏移量发送到事务,然后事务管理器提交事务。如果监听器抛出异常,事务将被回滚,消费者将被重新定位,以便在下一次轮询时可以检索到回滚的记录。有关更多信息以及如何处理重复失败的记录,请参见回滚后处理器。
使用事务可以实现精确一次语义(EOS)。
这意味着,对于一个 读取 → 处理 → 写入 序列,保证该 序列 只完成一次。(读取和处理具有至少一次语义)。
Spring for Apache Kafka 3.0 及更高版本仅支持 EOSMode.V2
-
V2- 又称 fetch-offset-request fencing (自版本 2.5 起)
| 这要求代理版本为 2.5 或更高。 |
在 V2 模式下,不需要为每个 group.id/topic/partition 都有一个生产者,因为消费者元数据会随偏移量一起发送到事务中,并且代理可以根据这些信息确定生产者是否被隔离。
请参阅 KIP-447 了解更多信息。
V2 之前是 BETA;EOSMode 已更改以使框架与 KIP-732 保持一致。