【问题标题】:Exactly-once semantics in spring KafkaSpring Kafka中的Exactly-once语义
【发布时间】:2019-08-25 20:47:05
【问题描述】:

我需要在包含以下组件的系统中应用事务:

  1. Kafka 生产者,这是一些外部应用程序,可以发布有关 kafka 主题的消息。
  2. Kafka 消费者,这是一个 Spring Boot 应用程序,我在其中配置了 kafka 侦听器,处理完消息后,需要将其保存到 NoSQL 数据库中。

我浏览了几个博客,例如 this 和 this,它们都在讨论流应用程序上下文中的事务,其中消息将被读取-处理-写入回 Kafka 主题。

我没有看到任何关于在类似于我的用例中实现事务性的明确示例或博客,即在单个原子事务中生成-处理-写入数据库。我相信这是非常常见的场景,也必须有一些支持。

有人可以指导我如何实现这一目标吗?任何相关的代码 sn-p 将不胜感激。

【问题讨论】:

  • 所以你问的是分布式事务而不是一次性语义?
  • 是的,这是一种分布式事务
  • >in a single atomic transaction。没有办法做到这一点; Kafka 不支持 XA 事务(大多数 NoSQL 数据库也不支持)。您可以使用 Spring 的事务同步来实现尽力而为的 1PC。

标签: apache-kafka spring-transactions spring-kafka


【解决方案1】:

在单个原子事务中。

没有办法做到这一点; Kafka 不支持 XA 事务(大多数 NoSQL 数据库也不支持)。您可以使用 Spring 的事务同步来实现尽力而为的 1PC。

见the documentation。

Spring for Apache Kafka 实现了正常的 Spring 事务同步。

它提供“尽力而为 1PC” - 请参阅 Distributed transactions in Spring, with and without XA 了解更多了解和限制。

【讨论】:

    【解决方案2】:

    我猜您正在尝试解决消费者在写入数据库后但在提交偏移量或其他类似问题之前出现故障的情况。不幸的是,这意味着您必须建立自己的容错能力。

    对于我上面提到的问题,这意味着您必须在最终输出数据库中管理消费者偏移量,并在您将消费者应用程序的输出写入到的同一数据库事务中更新它们。

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2020-03-12
      相关资源
      最近更新 更多