精确一次语义

您可以为监听器容器提供一个 `KafkaAwareTransactionManager` 实例。配置后,容器会在调用监听器之前启动一个事务。监听器执行的任何 `KafkaTemplate` 操作都会参与到该事务中。如果监听器成功处理了记录(或使用 `BatchMessageListener` 时处理了多条记录),容器会在事务管理器提交事务之前,使用 `producer.sendOffsetsToTransaction()` 将偏移量发送到事务。如果监听器抛出异常,事务将被回滚,并且消费者将被重新定位,以便在下次拉取时可以检索到回滚的记录。有关详细信息以及如何处理反复失败的记录,请参阅回滚后处理器

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

这意味着,对于一个 `读取 → 处理 → 写入` 序列,可以保证该**序列**精确地完成一次。(读取和处理具有至少一次语义)。

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

  • `V2` - 也称为 fetch-offset-request 隔离(自 2.5 版本起)

这要求 broker 的版本为 2.5 或更高。

在 `V2` 模式下,无需为每个 `group.id/topic/partition` 配置生产者,因为消费者元数据会随偏移量一起发送到事务中,broker 可以利用这些信息来确定生产者是否被隔离。

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

`V2` 此前是 `BETA`;`EOSMode` 已更改,以使框架与KIP-732 对齐。