【问题标题】:How to use transactions and rollbacks in an SOA architecture如何在 SOA 架构中使用事务和回滚
【发布时间】:2016-08-10 18:00:42
【问题描述】:

我目前正在从事一个 SOA 项目。

我必须开发几个处理链,也就是说,在 Java 的 ESB 中链接 Web 服务的 Web 服务。

由于每个要链接的 Web 服务都可能引发不同的异常,所以我考虑使用 Transactions 来回滚 Web 服务行为。

但是,我不知道这在 SOA 环境中是否可能,当每个服务都不同时。我搜索了它并找到了一些关于 AtomicTransactions 的信息,但我不确定它是否可以用来解决我的问题。

总之,我的问题是回滚服务真的可以吗?如果是这样,我该如何设置?

提前致谢。

【问题讨论】:

  • 我一直在研究这个问题,发现人们使用 Saga 模式。这不是一个完整的答案,所以把它放在评论中。 arnon.me/soa-patterns/saga
  • 只是一个问题,但您看过 JTA 吗?
  • 我没怎么用过JTA,但是可以在分布式环境中使用吗?我认为必须有不同的方法来做到这一点,因为关注点有所不同。您是否有任何链接可以帮助我在 SOA 中设置事务,或者它是纯 JTA 吗?有什么特别的注解吗?

标签: java web-services transactions soa esb


【解决方案1】:

在服务之间使用事务不是一个好习惯,因为您为不一定值得信赖的组件占用了资源,而且服务进程通常是长时间运行的(我在“transactional-integration anti-pattern”中写了更多关于它的内容。

正如评论中提到的那样,我发现“saga pattern”是处理这些长时间运行交互的更好方法

【讨论】:

  • 谢谢。我搜索了“saga 模式,如果我理解正确,这意味着我必须补偿服务所做的操作。服务是否需要取消服务方法的方法?例如,当执行 add() 方法时, 是不是必须在抛出异常的时候调用服务的 aremove() 方法?或者有没有其他的方法来实现?关于信息,我们的项目是使用编排组件来调用不同的服务。
  • 如果您从外部编排所有内容,您确实可以在服务上调用反向操作。另一种方法是让外部编排器只协调 saga 并让服务知道它失败了。然后每个服务都可以在内部处理故障,尽其所能以其他方式回滚或补偿。如果租约未续订和/或 saga 未成功提交,服务还可以根据其承诺维护租约并独立回滚
  • 谢谢。我们将尝试在我们的项目中实现这一点。我会尝试更深入地研究 Saga 模式。
  • 如果我们让每个服务自己进行反转,如果失败的服务也停止运行会发生什么情况,在这种情况下它无法发布失败事件让其他服务知道他们需要回滚.那么这笔交易就会陷入困境!
【解决方案2】:

我发现整个想法充其量是坏的。 SOA 和事务一直是一个令人头疼的问题。 提倡一组服务的逆向操作,也可能失败!那你会怎么做呢?

我知道英国有一家非常有名的媒体公司,它有一个专门的离岸团队,负责处理数据,但由于跨网络服务的编排失败,这让我大吃一惊。

最后,我认为使用 OEM BPM 引擎作为编排器可能有能力依赖于工作单元概念。然而,这个话题一直存在并且令人惊讶地仍然是一个问题。

【讨论】:

  • 我真的不明白为什么您会认为在 SOA 架构中拥有事务会很糟糕。我真的认为应该有一种方法可以做到这一点,也许在协议中添加跨服务事务的概念,而不必自己实现它。现在,我知道这不是一件容易的事,因为还会有其他问题,但是如果没有这个,你怎么能保持你的应用程序的完整性呢?
  • 嗨。其实我不认为他们是坏的。我只是说,做补偿不是一个好主意。另外,刚刚发现我的回复实际上是错误的。自从我上次参与 SOA 项目以来,事务的 OASIS 标准已经使用 Oracle Weblogic 11 实现,例如:docs.oasis-open.org/ws-tx/wstx-wsat-1.2-spec-cs-01/…
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2014-09-12
  • 1970-01-01
  • 2013-02-16
  • 2021-03-20
  • 2015-12-03
相关资源
最近更新 更多