V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Dxxxxs
V2EX  ›  程序员

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

  •  
  •   Dxxxxs · 2022-03-19 22:26:07 +08:00 · 1228 次点击
    这是一个创建于 971 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

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

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

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

    现在我的做法是

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

    问题

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

    abinnz
        1
    abinnz  
       2022-03-19 22:30:36 +08:00
    可以了解下阿里的 seata ,一款开源的分布式事务解决方案
    fyibmsd
        2
    fyibmsd  
       2022-03-19 22:38:56 +08:00
    2pc tcc
    5200721
        3
    5200721  
       2022-03-19 22:47:38 +08:00 via Android
    分布式事物
    SmiteChow
        4
    SmiteChow  
       2022-03-21 10:10:51 +08:00
    事务是需要有控制权才能做的,你显然没有其他服务的控制权,但是可以有变通的方法,其他服务在提供正向 API 的情况下配套提供反向撤销 API 就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2671 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 15:48 · PVG 23:48 · LAX 07:48 · JFK 10:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.