假设我们有一个用户、钱包 REST 微服务和一个将事物粘合在一起的 API 网关。当 Bob 在我们的网站上注册时,我们的 API 网关需要通过 User 微服务创建一个用户,并通过 Wallet 微服务创建一个钱包。
现在这里有一些情况可能会出错:
用户 Bob 创建失败:没关系,我们只是向 Bob 返回一条错误消息。我们正在使用 SQL 事务,所以没有人在系统中看到 Bob。一切都很好:)
用户 Bob 已创建,但在我们的钱包创建之前,我们的 API 网关硬崩溃。我们现在有一个没有钱包的用户(数据不一致)。
用户 Bob 已创建,当我们创建钱包时,HTTP 连接断开。钱包创建可能已经成功,也可能没有。
有哪些解决方案可以防止这种数据不一致的发生?是否存在允许事务跨越多个 REST 请求的模式?我已经阅读了关于两阶段提交的维基百科页面,这似乎涉及到这个问题,但我不确定如何在实践中应用它。This Atomic Distributed Transactions: a RESTful design paper 似乎也很有趣,虽然我还没有读过。
或者,我知道 REST 可能不适合这个用例。处理这种情况的正确方法可能是完全放弃 REST 并使用不同的通信协议(如消息队列系统)吗?或者我应该在我的应用程序代码中强制执行一致性(例如,通过有一个后台作业来检测不一致并修复它们,或者在我的用户模型上使用“创建”、“创建”值等的“状态”属性)?