spring Kafka 中的恰好一次语义
Exactly-once semantics in spring Kafka
我需要在包含以下组件的系统中应用交易:
- Kafka 生产者,这是一些外部应用程序,可以在 kafka 主题上发布消息。
- Kafka 消费者,这是一个 spring 启动应用程序,我在其中配置了 kafka 侦听器,在处理消息后,需要将其保存到 NoSQL 数据库中。
我浏览了几个博客,比如 this & this,它们都在谈论流应用程序上下文中的事务,其中消息将被读取-处理-写回 Kafka 主题。
我没有看到任何关于在类似于我的用例中实现事务性的明确示例或博客,即 在单个原子事务中对数据库进行生产-处理-写入。我相信这是非常普遍的情况并且也必须有一些支持。
有人可以指导我如何实现这一目标吗?任何相关的代码片段将不胜感激。
in a single atomic transaction.
没有办法; Kafka 不支持 XA 事务(大多数 NoSQL 数据库也不支持)。您可以使用 Spring 的事务同步来尽力而为 1PC。
Spring for Apache Kafka 实现正常的Spring事务同步。
它提供 "best efforts 1PC" - 请参阅 Distributed transactions in Spring, with and without XA 了解更多信息和限制。
我猜您正在尝试解决您的消费者在写入数据库后但在提交偏移量之前发生故障的情况,或其他类似问题。不幸的是,这意味着您必须构建自己的 fault-tolerance.
对于我上面提到的问题,这意味着您必须在 end-output 数据库中管理消费者偏移量,在您写入输出的同一个数据库事务中更新它们消费者申请。
我需要在包含以下组件的系统中应用交易:
- Kafka 生产者,这是一些外部应用程序,可以在 kafka 主题上发布消息。
- Kafka 消费者,这是一个 spring 启动应用程序,我在其中配置了 kafka 侦听器,在处理消息后,需要将其保存到 NoSQL 数据库中。
我浏览了几个博客,比如 this & this,它们都在谈论流应用程序上下文中的事务,其中消息将被读取-处理-写回 Kafka 主题。
我没有看到任何关于在类似于我的用例中实现事务性的明确示例或博客,即 在单个原子事务中对数据库进行生产-处理-写入。我相信这是非常普遍的情况并且也必须有一些支持。
有人可以指导我如何实现这一目标吗?任何相关的代码片段将不胜感激。
in a single atomic transaction.
没有办法; Kafka 不支持 XA 事务(大多数 NoSQL 数据库也不支持)。您可以使用 Spring 的事务同步来尽力而为 1PC。
Spring for Apache Kafka 实现正常的Spring事务同步。
它提供 "best efforts 1PC" - 请参阅 Distributed transactions in Spring, with and without XA 了解更多信息和限制。
我猜您正在尝试解决您的消费者在写入数据库后但在提交偏移量之前发生故障的情况,或其他类似问题。不幸的是,这意味着您必须构建自己的 fault-tolerance.
对于我上面提到的问题,这意味着您必须在 end-output 数据库中管理消费者偏移量,在您写入输出的同一个数据库事务中更新它们消费者申请。