微服务中的事务管理

Posted

技术标签:

【中文标题】微服务中的事务管理【英文标题】:Transaction management in microservices 【发布时间】:2021-11-18 04:48:37 【问题描述】:

我们正在使用微服务重写旧版应用程序。每个微服务都有自己的数据库。某些 api 调用需要调用另一个微服务并将数据持久化到两个数据库中。这种情况下如何有效实现分布式事务管理?

由于我们没有完全迁移到新的微服务环境,我们仍然将数据写回旧的单体。为此,当调用微服务端点时,我们从微服务 api 调用单体服务来写回相同的数据。在这种情况下如何处理同样的问题。

提前致谢。

【问题讨论】:

您是否研究过 2 阶段提交?在不同的微服务数据库之间进行这种级别的协调感觉有点像一种反模式,但我可以看到它很有用。检查此链接 fyi developers.redhat.com/blog/2018/10/01/… 【参考方案1】:

作为 JBoss 和 WebLogic 等重型应用服务器的一部分,通常包含和维护不同的分布式事务框架。

此类服务通常使用的标准是 Jakarta Transactions(JTA;以前的 Java Transaction API)。

Tomcat 和 Spring 不支持开箱即用的分布式事务。您可以使用 Atomikos 等第三方框架添加此功能(刚刚谷歌搜索,我从未使用过)。

但请记住,使用 JTA 的微服务不再是“微”了 :-)

以下是对可用技术和可能解决方法的简要概述:

https://www.baeldung.com/transactions-across-microservices

【讨论】:

谢谢,会处理这个【参考方案2】:

如果您以后有能力写入遗留系统(即在更新微服务和遗留系统之间允许一些延迟),您可以使用发件箱模式。

本质上,这意味着您以事务方式将微服务数据库写入您通常写入的表和要应用的附加“发件箱”更改表,然后有一个单独的进程读取该表并更新旧系统.

您还可以通过微服务中使用的数据库上的更改数据捕获机制来实现类似的功能

【讨论】:

谢谢,有帮助

以上是关于微服务中的事务管理的主要内容,如果未能解决你的问题,请参考以下文章

Service Mesh——微服务中的流量管理中间件

微服务中的会话管理

如何使用 Azure API 管理设计微服务架构中的身份验证和授权策略?

微服务中的事务发件箱模式与 ChainedKafkaTransactionManager

微服务架构中的分布式事务解决方案浅析

CQRS 和微服务中的数据管理