【问题标题】:Transaction when inter-communicate microservices微服务交互时的事务
【发布时间】:2016-05-10 05:16:56
【问题描述】:

我正在寻找在我的项目中的微服务之间进行相互通信时保持数据一致的最佳方法。

使用 Jersey + Guice 构建的项目,并使用 Akka 在整个系统中粘合服务。我在调用另一个服务时使用单独的事务以避免长时间运行的事务。我使用 Hibernate 作为 ORM 和 Postgres 作为 DB。 流程如下:

  1. 开始交易
  2. 做一些工作
  3. 提交事务
  4. 使用 Akka 调用另一个服务,接收或发送一些数据
  5. 开始交易
  6. 做剩余的工作
  7. 提交事务

因此,如果第 4 步失败,我的数据将处于不一致状态。我花了几个小时寻找解决方案来避免它,但我失败了。有什么正确的方法让它保持一致的状态吗?

【问题讨论】:

    标签: java hibernate transactions akka microservices


    【解决方案1】:

    微服务传奇在这里可能会有所帮助。更多详情Sagas

    【讨论】:

      【解决方案2】:

      好吧,如果您想避免长时间运行的事务,但又希望有一个逻辑等价物仍然(可能)长时间运行,那么您实际上是在将“事务”抽象推向应用程序级别。

      最简单的解决方案是接受这一点,并为您的数据创建一些列,表明记录是脏的,然后在步骤 (6) 中使它们不脏。

      【讨论】:

      • 感谢您的回答。我有这样的想法,但如何从这种状态恢复数据?每个请求都从第 1 步开始,不能从第 5 步开始。看来我需要一些 cron 来继续剩余的工作或类似的东西。
      • 数据就是数据。逻辑在您的代码中。如果您想重试整个过程,那么您可以编写这样的逻辑:在 cron 中,一个与您的原始请求或其他内容分开的微服务。事务的原始想法与我的提议之间的区别在于,对于错误的“流程”(我们将步骤 1-8 称为流程),在前一种情况下,您根本不会在数据库中拥有数据,而在后一种情况下如果你会有脏记录。这可能很好,因为您将有机会重试它们。如果你想要的话。如果没有更详细的信息,很难说什么最适合您..
      • 我认为最好的选择是使用某种消息系统(服务总线、rabbit mq 等),其中内置了重复工作、异步通信等机制,因此您不必重新发明自己的轮子。您可以尝试阅读有关 sagas 的信息,这是一些已知的方法。当您切换到消息传递时,您所关心的主要是按正确的顺序发布消息以创建某种工作流程。重复工作就像将消息重新安排回队列一样简单。
      猜你喜欢
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2014-08-31
      • 2020-08-19
      • 2021-03-31
      • 2015-07-24
      • 2020-02-20
      相关资源
      最近更新 更多