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