使用 saga 处理微服务架构中的并发请求和回滚

问题描述 投票:0回答:1

下面的场景我们应该如何处理?假设我们有三个微服务。我们收到两个并发请求,更新这些微服务中的相同记录。第一个请求在微服务 1 和 2 中成功执行并保留,但在微服务 3 中遇到问题。同时,第二个请求更新微服务 1、2 和 3 中的相同记录。现在,微服务 1 发布补偿消息以回滚微服务1和2中的第一个请求。但是,在此期间,微服务1和2中的记录已经被第二个请求更新了。如何回滚微服务1和2中更新的记录?

masstransit saga
1个回答
0
投票

如果使用事件溯源模式,您的问题可以得到有效解决。通过事件溯源,应用程序状态的每次更改都会作为新记录存储在系统中,每个记录都带有唯一的

operationId
标记。 在您的特定情况下,每个状态更新操作都会生成一个带有
operationId
的唯一事件。例如,您的第一次和第二次更新将分别用
operationId 1
operationId 2
记录。当由于其中一项服务出现故障而需要触发补偿时(例如,Microservie 3 中出现
operationId 1
故障),您的服务将使用补偿事件并记录与
operationId 1
关联的 UNDO 事件。此 UNDO 事件显式恢复原始操作所做的更改。当恢复对象的状态时,您的系统将按顺序处理所有匹配的事件,过滤掉那些具有
operationId
的 UNDO 事件的事件。这意味着如果存在伴随的 UNDO 事件,
operationId 1
的效果将被撤消,而
operationId 2
的更改将保留。 对于实际实现,您可以参考 GitHub https://github.com/vladovsiychuk/saga-orchestrator-ddd-chat 中的项目,其中使用类似的模式来处理分布式、事件驱动架构。

© www.soinside.com 2019 - 2024. All rights reserved.