spring-boot - 如何在两个微服务之间进行两阶段提交( Spring 启动)?

标签 spring-boot microservices distributed-transactions 2phase-commit

我有两个mico-serives A和B连接到单独的数据库,从Mico-serives A,我需要以相同的转换持久化(保存)A和B的对象,以实现这一目标。

我正在使用带有netflix-oss的Spring微服务。请给出有关实现两阶段提交的最佳方法的建议。

最佳答案

您无法在分布式环境中的微服务中实现传统的交易系统。

您应该使用 Event Sourcing + CQRS 技术,由于它们是原子性的,因此您将获得诸如在整体系统中实现事务或2PC的功能。

其他可能的方法是 transaction-log-mining ,我认为link-in使用的是这种方法,但它有其优点和缺点。例如不同数据库的二进制日志是不同的,并且同一类型的数据库中的事件在不同版本之间也存在差异。

我建议您在事件存储中使用事件源+ CQRS和字符串事件,然后在微服务A和B之间转移多个事件并在每个步骤中更新域状态之后,尝试根据 CAP定理达到最终一致性

建议您使用诸如 ActiveMQ RabbitMQ Kafka 之类的消息代理在不同的微服务之间发送基于事件的事件,并将它们放入事件存储区中,例如mysql或其他系统。

除了模仿事务之外,这种方式的另一个好处是您将拥有完整的审核日志

关于spring-boot - 如何在两个微服务之间进行两阶段提交( Spring 启动)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44114755/

相关文章:

c# - 使用 WCF 的分布式事务

带有java FX的Spring数据jpa

mysql - 通讯链路故障-MySQL+JDBC

java - 如何将抽象类作为微服务的入口api契约并同时解决多态性?

node.js - 跟踪和记录从 node.js 服务器内部发出的 http 调用

microservices - 为什么两阶段提交不适合微服务架构?

distribution - 三阶段提交

java - 摆脱 spring-boot-samples 作为父项目

java - 使用当前系统日期在单独的目录中为每个日期创建日志文件

java - 处理 Apache ServiceComb 补偿方法中的附加数据