微服务交互时的事务
Transaction when inter-communicate microservices
我正在寻找在项目中的微服务之间相互通信时保持数据一致的最佳方法。
使用 Jersey + Guice 构建的项目,并使用 Akka 粘合整个系统中的服务。我在对另一个服务的调用中使用单独的事务来避免 long-运行 事务。我使用 Hibernate 作为 ORM,使用 Postgres 作为数据库。
过程看起来像:
- 开始交易
- 做一些工作
- 提交交易
- 使用 Akka 调用另一个服务,接收或发送一些数据
- 开始交易
- 完成剩余的工作
- 提交交易
因此,如果第 4 步失败,我的数据将处于不一致状态。我花了几个小时寻找解决方案来避免它,但我失败了。有什么正确的方法可以让它保持一致的状态吗?
好吧,如果你想避免长期 运行 交易,但希望拥有它们的逻辑等价物,它仍然(可能)长期 运行,那么你实际上是在推动 "transaction" 抽象到应用层。
最简单的解决方案是接受它并为您的数据创建一些列来指示记录是脏的,然后在步骤 (6) 中使它们不脏。
微服务传奇在这里可能会有所帮助。有关 Sagas
的更多详细信息
我正在寻找在项目中的微服务之间相互通信时保持数据一致的最佳方法。
使用 Jersey + Guice 构建的项目,并使用 Akka 粘合整个系统中的服务。我在对另一个服务的调用中使用单独的事务来避免 long-运行 事务。我使用 Hibernate 作为 ORM,使用 Postgres 作为数据库。 过程看起来像:
- 开始交易
- 做一些工作
- 提交交易
- 使用 Akka 调用另一个服务,接收或发送一些数据
- 开始交易
- 完成剩余的工作
- 提交交易
因此,如果第 4 步失败,我的数据将处于不一致状态。我花了几个小时寻找解决方案来避免它,但我失败了。有什么正确的方法可以让它保持一致的状态吗?
好吧,如果你想避免长期 运行 交易,但希望拥有它们的逻辑等价物,它仍然(可能)长期 运行,那么你实际上是在推动 "transaction" 抽象到应用层。
最简单的解决方案是接受它并为您的数据创建一些列来指示记录是脏的,然后在步骤 (6) 中使它们不脏。
微服务传奇在这里可能会有所帮助。有关 Sagas
的更多详细信息