【发布时间】:2017-10-22 05:20:58
【问题描述】:
我有两个微服务 A 和 B,它们连接到单独的数据库,从微服务 A 我需要在相同的转换中持久(保存)A 和 B 的对象如何实现这一点。
我正在使用带有 netflix-oss 的 Spring 微服务。请就完成 2 阶段提交的最佳方法提出建议。
【问题讨论】:
标签: spring-boot microservices distributed-transactions 2phase-commit
我有两个微服务 A 和 B,它们连接到单独的数据库,从微服务 A 我需要在相同的转换中持久(保存)A 和 B 的对象如何实现这一点。
我正在使用带有 netflix-oss 的 Spring 微服务。请就完成 2 阶段提交的最佳方法提出建议。
【问题讨论】:
标签: spring-boot microservices distributed-transactions 2phase-commit
你无法在分布式环境中的微服务中实现传统的事务系统。
您应该使用 Event Sourcing + CQRS 技术,因为它们是原子的,您将获得诸如在单片系统中实现事务或 2PC 之类的东西。
其他可能的方式是 transaction-log-mining,我认为linked-in 正在使用这种方式,但它有自己的优缺点。例如不同数据库的二进制日志不同,同一种数据库的事件不同版本也有差异。
我建议您在事件存储中使用 Event Sourcing + CQRS 和字符串事件,然后在微控制器之间传输多个事件后尝试基于 CAP 定理 达到 最终一致性服务 A 和 B 并在每个步骤中更新域状态。
建议您使用 ActiveMQ、RabbitMQ 或 Kafka 等消息代理在不同的微服务和字符串之间发送事件源事件它们在 mysql 或其他系统等事件存储中。
除了模仿交易之外,这种方式的另一个好处是您将拥有完整的审核日志。
【讨论】:
这是一个架构(微服务)问题。 Spring boot 或 netflix-oss 不提供直接解决方案。您必须实施自己的解决方案。请与event driven architecture 联系。它可以给你一些想法。
【讨论】:
你可以试试 SAGA 模式https://microservices.io/patterns/data/saga.html
【讨论】: