工作中遇到的一个真实场景 一个电商系统,现在涉及三个独立服务之间的交互 售后服务(负责订单取消动作的发起)、订单服务(负责订单数据的管理)、营销服务(负责券数据的管理)。 现在考虑这样一个场景,某个订单通过活动获得了优惠券。售后服务 需要分别和订单服务、营销服务 发生如下交互:
但是有可能发生如下调用结果:
先冻结券,然后判断冻结是否成功。如果冻结失败则流程结束,向下游返回无法取消订单的消息。 如果冻结券成功则取消订单,判断订单是否取消成功。如果取消成功流程结束,如果取消失败则重试三次,如果重试 3 次仍然失败则向 DB 插入一条异常记录,用定时任务定时批量重试。
但是感觉这样的方案还是实现的不太优雅。 想问一下类似这种不同微服务之间接口调用,还想要达到一种类似 DB 中 事务 的场景有没有更合适的解决方案?
1
abinnz 2022-03-19 22:30:36 +08:00
可以了解下阿里的 seata ,一款开源的分布式事务解决方案
|
2
fyibmsd 2022-03-19 22:38:56 +08:00
2pc tcc
|
3
5200721 2022-03-19 22:47:38 +08:00 via Android
分布式事物
|
4
SmiteChow 2022-03-21 10:10:51 +08:00
事务是需要有控制权才能做的,你显然没有其他服务的控制权,但是可以有变通的方法,其他服务在提供正向 API 的情况下配套提供反向撤销 API 就可以了。
|