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