Java SOA中跨服务的原子性和一致性

Java SOA中跨服务的原子性和一致性,java,rest,transactions,soa,xa,Java,Rest,Transactions,Soa,Xa,在我的生态系统中,我面临着一些跨服务的原子性和耐久性问题 假设我有服务A、B和C。现在一个客户机与服务A对话来做一些事情。但服务A依次与B和c对话,然后将结果转发给客户端。假设我能够将某些资源作为服务B的一部分进行更新,但无法将某些资源作为服务C的一部分进行更新。然后,我将如何实现跨服务的一致性,即如果C失败,作为服务B一部分的所有更新也应回滚 是XA是前进的方向,还是其他更优雅的东西出现了 是XA是前进的方向,还是其他更优雅的东西出现了 SOA的目标之一是实现松耦合。 有几种形式的松耦合(或可

在我的生态系统中,我面临着一些跨服务的原子性和耐久性问题

假设我有服务A、B和C。现在一个客户机与服务A对话来做一些事情。但服务A依次与B和c对话,然后将结果转发给客户端。假设我能够将某些资源作为服务B的一部分进行更新,但无法将某些资源作为服务C的一部分进行更新。然后,我将如何实现跨服务的一致性,即如果C失败,作为服务B一部分的所有更新也应回滚

是XA是前进的方向,还是其他更优雅的东西出现了

是XA是前进的方向,还是其他更优雅的东西出现了

SOA的目标之一是实现松耦合。 有几种形式的松耦合(或可以应用松耦合的不同系统方面)。 其中一种松散耦合形式与交易有关

使用XA事务,您的代码不需要处理其他流,因此代码更清晰,更易于维护

在这一点上,您的问题有了一个优雅的解决方案

然而,这种“简单性”是有代价的:您的服务是以事务形式耦合的。 特别是,如果参与您交易的某些服务属于第三方系统(它不在您的控制之下),则存在外部系统锁定您的服务的风险

如果这种耦合成为一个问题,那么解决方案可能是消除XA事务并编写处理可选流的代码。这就是传奇模式出现的地方。其思想是,如果业务流程的一个步骤失败,您必须以编程方式保持一致性,实现所谓的补偿代码

在这一点上,您的问题也有了一个优雅的解决方案,尽管您的代码变得更加复杂

我见过类似于您所描述的场景,其中由于缺少XA事务,服务代码不必要地过于复杂。 我这样说是不必要的,因为那里的事务耦合没有问题。
我认为很难看到事务耦合大到足以用值得付出努力的补偿代码替换XA事务的情况。

根据本书作者的说法,使用分布式事务被认为是一种反模式(事务集成),一种更适合SOA实践的方法是实现所谓的Saga模式。也许你能找到这本书有用的章节。@GabrielAramburu你能在这里解释一下吗,这样对没有这本书的人会有帮助。谢谢