Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 微服务中的事务_Java_Web Services_Design Patterns_Architecture_Soa - Fatal编程技术网

Java 微服务中的事务

Java 微服务中的事务,java,web-services,design-patterns,architecture,soa,Java,Web Services,Design Patterns,Architecture,Soa,我读过一些关于微服务体系结构的文章,但没有人讨论事务。他们说这很难做到。也许有人能描述一下如何处理这个问题 但不是从领域方面,而是从技术方面。假设我们有一个业务案例,我们需要调用两个不同的服务,并且它们都对数据库进行了一些更改。但是,如果第二个发生错误,如何回滚 谁知道这个问题的一些库或设计模式呢?最好的设计是使用独立的服务:每个服务只在其自己的事务中工作,您的工作流预期单个服务会失败 如果您真的只需要在所有服务都被无错误调用的情况下提交,那么您应该创建一个更高级别的服务,在外部事务中执行这些调

我读过一些关于微服务体系结构的文章,但没有人讨论事务。他们说这很难做到。也许有人能描述一下如何处理这个问题

但不是从领域方面,而是从技术方面。假设我们有一个业务案例,我们需要调用两个不同的服务,并且它们都对数据库进行了一些更改。但是,如果第二个发生错误,如何回滚


谁知道这个问题的一些库或设计模式呢?

最好的设计是使用独立的服务:每个服务只在其自己的事务中工作,您的工作流预期单个服务会失败


如果您真的只需要在所有服务都被无错误调用的情况下提交,那么您应该创建一个更高级别的服务,在外部事务中执行这些调用。

我可能不是这方面的最终专家,但我相信您正在走向分布式事务。为了让它们运行,所有应用程序服务组件都需要一个公共的共享事务id,并且您必须确保每个组件都被告知事务的状态。它是异步的,因此您需要大量的编程技能

这里提到或讨论了分布式事务:

人们似乎试图避免它,因为它是困难的。也许这就是为什么你找不到太多


希望这有助于向前迈进一步:-)

在前面的答案的基础上,分布式事务是解决方案。在我看来,您不希望构建自己的跟踪全局事务状态的机制,而是希望使用某种产品—有几种。我写了一篇关于使用Java应用程序服务器解决此问题的长篇博客文章:


可以选择两阶段提交。协调器向队列发送提交请求消息。队列发回ok。然后协调器向队列发送提交消息。如果发生任何故障,协调器向队列发送回滚消息。

阅读此问题后,我想到的第一件原始事情是创建每个队列addapi和deleteapi,比如说,还有一个额外的布尔标志delFlag

布尔标志delFlag

对于POST,它将是0。对于删除,它将是1

现在您维护一个事务管理器,它是所有微服务的超级服务。 在此服务中,维护所有服务和API的调用队列。当服务失败时,获取调用api并调用该服务的delete方法,然后撤消您所做的任何操作


PS-只是一个原始的想法。如果你认为这是错误的,请纠正我

您可以使用工作流引擎(如JBPM、Activiti)协调逻辑,并处理其中的事务失败或补偿性事务,以实现数据完整性。这与您在SOA体系结构和ESB中使用的情况类似,BPMN和Web服务

你的意思是什么:>你应该创建一个更高级别的服务我的意思是,你应该有另一个服务来初始化一个全局事务,并使用这个事务调用你的其他服务来提交/回滚,具体取决于你所有调用的结果。我不知道这个结果到底是如何实现的,这取决于你使用的技术。我认为本文可以提供一些有用的信息()。安威,如前所述,这是一个非常具有挑战性的环境,对每项服务使用单独的事务会更好。在这里,您可以找到一个有用的真实示例,说明如何解决您的问题: