微服务之间的接口调用有没有类似事务的实现

2022-03-19 22:26:07 +08:00
 Dxxxxs

背景

工作中遇到的一个真实场景 一个电商系统,现在涉及三个独立服务之间的交互 售后服务(负责订单取消动作的发起)、订单服务(负责订单数据的管理)、营销服务(负责券数据的管理)。 现在考虑这样一个场景,某个订单通过活动获得了优惠券。售后服务 需要分别和订单服务营销服务 发生如下交互:

  1. 调用营销服务冻结此订单获得的优惠券
  2. 调用订单管理服务取消订单

但是有可能发生如下调用结果:

  1. 券冻结成功但是订单取消失败。
  2. 订单取消成功但是券冻结失败。

现在我的做法是

先冻结券,然后判断冻结是否成功。如果冻结失败则流程结束,向下游返回无法取消订单的消息。 如果冻结券成功则取消订单,判断订单是否取消成功。如果取消成功流程结束,如果取消失败则重试三次,如果重试 3 次仍然失败则向 DB 插入一条异常记录,用定时任务定时批量重试。

问题

但是感觉这样的方案还是实现的不太优雅。 想问一下类似这种不同微服务之间接口调用,还想要达到一种类似 DB 中 事务 的场景有没有更合适的解决方案?

1073 次点击
所在节点    程序员
4 条回复
abinnz
2022-03-19 22:30:36 +08:00
可以了解下阿里的 seata ,一款开源的分布式事务解决方案
fyibmsd
2022-03-19 22:38:56 +08:00
2pc tcc
5200721
2022-03-19 22:47:38 +08:00
分布式事物
SmiteChow
2022-03-21 10:10:51 +08:00
事务是需要有控制权才能做的,你显然没有其他服务的控制权,但是可以有变通的方法,其他服务在提供正向 API 的情况下配套提供反向撤销 API 就可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841541

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX