假设我们有一个用户、钱包REST微服务和一个API网关将它们粘合在一起。当Bob在我们的网站上注册时,我们的API网关需要通过用户微服务创建用户和通过钱包微服务创建钱包。
现在这里有几种情况可能会出错:
创建用户Bob失败:没关系,我们只需向Bob返回错误信息。我们正在使用SQL事务,所以没有人曾经在系统中看到过Bob。一切都很好 :)
在我们的钱包创建之前,用户Bob被创建了,但是API网关突然崩溃了。现在我们有一个没有钱包的用户(不一致的数据)。
创建用户Bob并且在我们创建钱包时,HTTP连接断开了。钱包创建可能已成功,也可能未成功。
另外,我知道REST可能并不适合这种用例。也许处理这种情况的正确方法是完全放弃REST,并使用像消息队列系统这样的不同通信协议?或者应该在我的应用程序代码中强制执行一致性(例如,通过具有检测不一致性和修复它们的后台作业或通过在我的用户模型上具有“创建”、“已创建”等值的“状态”属性)?