Spring Kafka中的一次语义

时间:2019-04-04 07:26:40

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

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

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

我浏览了thisthis之类的几个博客,他们都讨论了在流应用程序上下文中的事务,其中消息将被读处理后写回到Kafka话题。

在类似于我的用例(即在单个原子事务中将处理生成写入数据库)中,我看不到任何明确的示例或博客来实现事务性。我认为这是非常普遍的情况,并且也必须对此提供一些支持。

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

2 个答案:

答案 0 :(得分:1)

  

在单个原子事务中。

没有办法做到; Kafka不支持XA事务(大多数NoSQL DB也不支持)。您可以将Spring的事务同步用于最大努力1PC。

请参见the documentation

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

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

答案 1 :(得分:1)

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

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