我们正在考虑在Spring Boot WebFlux服务中使用spring-kafka,我发现它有一个KafkaTransactionManager,但据我了解,这更多是关于Kafka事务本身的(确保Kafka生产者和消费者之间的一致性),而不是在两个系统之间同步事务(请参见这里:“Kafka不支持XA,你必须处理DB tx可能会提交而Kafka tx回滚的可能性。”)。此外,我认为这个类依赖于Spring的事务框架,至少就我目前的理解而言,这是线程绑定的,如果使用反应式方法(例如WebFlux),其中操作的不同部分可能在不同的线程上执行,那么它将无法工作。(我们正在使用reactive-pg-client,因此手动处理事务,而不是使用Spring的框架。)
我能想到的一些选项:
- 不要直接将数据写入数据库:只需将其写入Kafka。然后使用消费者(在服务A中)更新数据库。这似乎不是最有效的方法,并且会出现问题,因为用户调用的服务无法立即看到它应该创建的数据库更改。
- 不要直接写入Kafka:只需写入数据库,然后使用类似于Debezium的工具将更改报告给Kafka。问题在于更改基于单个数据库记录,而存储在Kafka中的业务重要事件可能涉及来自多个表的数据组合。
- 首先写入数据库(如果失败,则不执行任何操作并仅抛出异常)。然后,在写入Kafka时,假设写入可能失败。使用内置的自动重试功能尝试保持一段时间。如果最终完全失败,请尝试写入死信队列,并创建某种手动机制供管理员进行排序。如果写入DLQ失败(即Kafka完全关闭),则以其他方式记录它(例如,记录到数据库中),并再次创建某种手动机制供管理员进行排序。
有没有人对上述内容有任何想法或建议,或者能够纠正我上面的错误?
提前感谢!
TransactionSynchronization
。请参阅TransactionSynchronizationManager
,尽管我不知道它如何帮助你,因为你担心的是反应式和非单线程执行... - Artem Bilan