我对MicroServices有疑问。假设有5个微服务,比如M1、M2、M3、M3、M4和M5.有4个数据库由4个微服务连接/访问.例如,M2连接到MySQL,M3连接到卡桑德拉,M4连接到MongoDB,M5连接到甲骨文。
现在
步骤1: M1调用M2更新MySQL中的一些用户数据,并成功地进行了更新,最后获得了M2的成功响应。
步骤2: M1调用M3更新卡桑德拉中的一些数据,并成功地进行了更新,最后得到了M3的成功响应。
步骤-3: M1调用M4更新MongoDB中的一些数据,但由于一些DB服务器问题或任何其他问题而失败。
在这里,我的要求是,我希望回滚以前的微服务(M2和M3)中发生的DB更改。
为了实现这种回滚场景,我们需要做些什么?
发布于 2019-10-01 13:38:20
这是分布式事务的典型情况。不管您对数据库使用不同的技术,或者在不同的服务器上使用相同的技术,您都会执行一个事务性操作。为了处理该类型事务的回滚,您不能在数据库技术机制上中继事务和回滚。你得自己去做。
Saga模式
微服务体系结构中分布式事务场景的常见解决方案是Saga模式。分布式sagas是一种用于管理方案中的失败的模式,正如您所描述的那样。
Saga是基于业务流程创建的,例如“在网上商店购买产品”。此过程可能涉及多个微服务上的多个操作。Saga将控制和管理此流程执行,如果其中一个步骤失败,它将触发操作以恢复失败操作之前所做的操作。
实现sagas有多种方法。这取决于您的体系结构以及您的微服务之间的通信方式。您使用命令和/或事件吗?
示例
“网上购物”业务流程。假设这个业务流程有3个简单的步骤,由3个不同的微服务完成:
使用事件的:
您可以发布事件来执行某些操作(或操作),如果其中一个操作失败,则可以发布该事件的还原(或删除)事件。对于上面的业务流程,假设1.操作成功,2.操作失败。在这种情况下,为了回滚1..action,您将发布一个类似于"RemoveReservationFromProduct“的事件,以便删除保留,并将状态还原回该业务流程的事务开始之前的状态。该事件将由事件处理程序接收,该事件处理程序将在数据库中恢复该状态。因为它是一个事件,所以您可以为失败实现重试机制,或者在代码中有一些错误时重新应用它。
使用命令的:
如果您使用某种rest命令直接调用您的微服务,您可以运行一些删除或更新端点来恢复您所做的更改。对于上面的业务流程,假设1.操作成功,2.操作失败。在这种情况下,为了回滚1..action,您将调用delete api来删除特定产品的保留,以便删除保留,并将状态还原回该业务流程的事务开始之前的状态。
您可以查看如何实现Saga模式的这示例。
发布于 2019-10-01 11:58:08
据我所知,传奇是你要找的东西。这样做的目的是为每个状态改变操作提供一个撤销操作,如果情况恶化,就必须调用撤销操作。
发布于 2019-10-01 07:18:49
您可以确保在整个调用序列中启用了@Transactional。
这可能不是一个完美的解决方案,因为它引入了另一个故障点作为/rollback处理,但最快的一个可以实现。
https://stackoverflow.com/questions/58178511
复制相似问题