8

我有两个微服务 A 和 B,它们连接到单独的数据库,从微服务 A 我需要在相同的转换中持久(保存)A 和 B 的对象如何实现这一点。

我正在使用带有 netflix-oss 的 Spring 微服务。请就完成 2 阶段提交的最佳方法提出建议。

4

3 回答 3

8

你无法在分布式环境中的微服务中实现传统的事务系统。

您应该使用Event Sourcing + CQRS 技术,因为它们是原子的,您将获得诸如在单片系统中实现事务或 2PC 之类的东西。

其他可能的方式是事务日志挖掘,我认为链接中正在使用这种方式,但它有其自身的缺点和优点。例如,不同数据库的二进制日志是不同的,同一种数据库中的事件在不同版本之间存在差异。

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

建议您使用ActiveMQRabbitMQKafka等消息代理在不同微服务之间发送事件源事件,并将它们串入 mysql 或其他系统等事件存储中。

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

于 2017-05-22T16:16:43.087 回答
2

这是一个架构(微服务)问题。Spring boot 或 netflix-oss 不提供直接解决方案。您必须实施自己的解决方案。检查事件驱动架构。它可以给你一些想法。

于 2017-05-22T14:13:19.553 回答
2

您可以尝试 SAGA 模式https://microservices.io/patterns/data/saga.html

于 2019-07-02T10:54:49.617 回答