首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何回滚MicroServices

如何回滚MicroServices
EN

Stack Overflow用户
提问于 2019-10-01 05:25:01
回答 4查看 16K关注 0票数 22

我对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更改。

为了实现这种回滚场景,我们需要做些什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-01 13:38:20

这是分布式事务的典型情况。不管您对数据库使用不同的技术,或者在不同的服务器上使用相同的技术,您都会执行一个事务性操作。为了处理该类型事务的回滚,您不能在数据库技术机制上中继事务和回滚。你得自己去做。

Saga模式

微服务体系结构中分布式事务场景的常见解决方案是Saga模式。分布式sagas是一种用于管理方案中的失败的模式,正如您所描述的那样。

Saga是基于业务流程创建的,例如“在网上商店购买产品”。此过程可能涉及多个微服务上的多个操作。Saga将控制和管理此流程执行,如果其中一个步骤失败,它将触发操作以恢复失败操作之前所做的操作。

实现sagas有多种方法。这取决于您的体系结构以及您的微服务之间的通信方式。您使用命令和/或事件吗?

示例

“网上购物”业务流程。假设这个业务流程有3个简单的步骤,由3个不同的微服务完成:

  • 行动1-产品储备.库存.微型服务
  • 行动2-验证付款方式-小额服务
  • 行动3-按订单订购产品.微型服务

使用事件的

您可以发布事件来执行某些操作(或操作),如果其中一个操作失败,则可以发布该事件的还原(或删除)事件。对于上面的业务流程,假设1.操作成功,2.操作失败。在这种情况下,为了回滚1..action,您将发布一个类似于"RemoveReservationFromProduct“的事件,以便删除保留,并将状态还原回该业务流程的事务开始之前的状态。该事件将由事件处理程序接收,该事件处理程序将在数据库中恢复该状态。因为它是一个事件,所以您可以为失败实现重试机制,或者在代码中有一些错误时重新应用它。

使用命令的

如果您使用某种rest命令直接调用您的微服务,您可以运行一些删除或更新端点来恢复您所做的更改。对于上面的业务流程,假设1.操作成功,2.操作失败。在这种情况下,为了回滚1..action,您将调用delete api来删除特定产品的保留,以便删除保留,并将状态还原回该业务流程的事务开始之前的状态。

您可以查看如何实现Saga模式的示例。

票数 21
EN

Stack Overflow用户

发布于 2019-10-01 11:58:08

据我所知,传奇是你要找的东西。这样做的目的是为每个状态改变操作提供一个撤销操作,如果情况恶化,就必须调用撤销操作。

票数 5
EN

Stack Overflow用户

发布于 2019-10-01 07:18:49

您可以确保在整个调用序列中启用了@Transactional。

  1. 考虑将来自M1的所有微服务调用为单个事务。
  2. 以下列方式公开回滚:
    • 在更新M2、M3和M4中的DB时,将值与DB放在Spring缓存中。
    • 在M2、M3或M4中调用M3时,从Spring获取值并从DB中撤消它们。

  1. 在hysterix命令的fallbackMethod中,当M1用错误或某些默认输出应答时,调用其他服务的/rollback。

这可能不是一个完美的解决方案,因为它引入了另一个故障点作为/rollback处理,但最快的一个可以实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58178511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档