跨REST微服务的事务?

246

假设我们有一个用户、钱包REST微服务和一个API网关将它们粘合在一起。当Bob在我们的网站上注册时,我们的API网关需要通过用户微服务创建用户和通过钱包微服务创建钱包。

现在这里有几种情况可能会出错:

  • 创建用户Bob失败:没关系,我们只需向Bob返回错误信息。我们正在使用SQL事务,所以没有人曾经在系统中看到过Bob。一切都很好 :)

  • 在我们的钱包创建之前,用户Bob被创建了,但是API网关突然崩溃了。现在我们有一个没有钱包的用户(不一致的数据)。

  • 创建用户Bob并且在我们创建钱包时,HTTP连接断开了。钱包创建可能已成功,也可能未成功。

有哪些解决方案可以防止这种数据不一致性的发生?是否有模式允许事务跨越多个REST请求?我已经阅读了维基百科关于两阶段提交的页面,它似乎涉及到了这个问题,但我不确定如何在实践中应用它。这篇原子分布式事务:RESTful设计论文也很有趣,尽管我还没有读过它。
另外,我知道REST可能并不适合这种用例。也许处理这种情况的正确方法是完全放弃REST,并使用像消息队列系统这样的不同通信协议?或者应该在我的应用程序代码中强制执行一致性(例如,通过具有检测不一致性和修复它们的后台作业或通过在我的用户模型上具有“创建”、“已创建”等值的“状态”属性)?

4
有趣的链接:https://news.ycombinator.com/item?id=7995130 - Olivier Lalonde
4
如果一个用户没有钱包就不合理,为什么要为它创建一个单独的微服务?也许最初的架构存在问题?顺便问一下,为什么需要一个通用的API网关?有特别的原因吗? - Vladislav Rastrusny
6
@VladislavRastrusny 这只是一个虚构的例子,但你可以把钱包服务看作是由 Stripe 等机构处理。 - Olivier Lalonde
1
你可以使用进程管理器来跟踪事务(进程管理器模式),或让每个微服务知道如何触发回滚(saga管理器模式),或执行某种形式的两阶段提交。 (http://blog.aspiresys.com/software-product-engineering/producteering/distributed-transactions-in-microservices/) - andrew pate
“如果一个用户没有钱包就没有意义,为什么要为此创建一个单独的微服务”--例如,除了用户不能存在于没有钱包的情况下之外,它们没有任何共同的代码。因此,两个团队将独立开发和部署用户和钱包微服务。这不是首先进行微服务的整个重点吗? - Nik
1
@OlivierLalonde - 快进到2019年...你最终是如何处理这个问题的?最好的方法/解决方案是什么?如果您能回答这个很棒的问题,那将会很有帮助。 - C.P.
11个回答

-3
为什么不使用支持脚本/编程的API管理(APIM)平台?这样,您就可以在APIM中构建组合服务,而不会干扰微服务。我已经使用APIGEE设计了这个目的。

APIM 是创建和发布 Web 应用程序的过程。我不明白它如何在这里有所帮助。你能解释一下吗? - AjayLohani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接