我有一个用例如下所示:
一个Quarkus微服务负责与其他几个固定API (例如ArgoCD REST、标准企业驱动API)交谈,以使整个系统处于所需的状态。
整个请求需要事务处理,这意味着所有API请求都需要成功,或者在发生任何错误时回滚。
如果API返回错误,情况对我来说是明确的。“只需恢复以前所做的一切”,但是如果我的Quarkus应用程序崩溃了,会发生什么呢?
举个例子:
Quarkus应用程序在端点上接收POST请求,该请求启动以下任务:
如果我的Quarkus应用程序在第二步之后死亡,它将使我的应用程序处于不一致的状态。
例如,我的第二个请求将使用它的REST创建一个application,如果第三个请求失败,我必须再次删除创建的应用程序,以使系统恢复到一致的状态。
上帝军方法在这里不适用,因为ArgoCD Rest没有实现上帝抵抗计划。
因此,至少,我必须在Quarkus应用程序中维护状态和补偿逻辑。但是,我需要将事务的状态保存在任何地方,以便在失败后从它恢复。
除了使用Redis数据库之外,我的当前解决方案还可以持久化每个事务的状态,直到它完成为止,但是我想知道是否遗漏了一些与我的用例匹配的标准解决方案。
发布于 2022-03-15 10:31:03
我认为要达到你想要的目标,没有简单的方法。当然,这取决于您的业务可接受的弹性或隔离级别。实际上,有一个专门的MicroProfile规范,名为上帝军 (长时间运行操作),仅用于解决这个问题。它是佐贺模式的实现。
问题是,仅仅依靠调用那些API上的回滚是不够的。如果那些回滚失败了,还有很多其他的情况。在这种情况下,总是需要有一名协调员来协调整个进程。您可以在上面的链接,甚至上帝军的Quarkus分机中读到更多关于它的信息。
我知道,如果您无法访问这些API的源代码来添加上帝抵抗军注解,就可能没有必要解决您的问题,但我希望它能给您一些关于人们通常解决这个问题的方法的想法。
https://stackoverflow.com/questions/71437324
复制相似问题