美文网首页
异步调用场景

异步调用场景

作者: Candy_糖果 | 来源:发表于2019-03-01 08:27 被阅读0次

    工作问题

    某个单子被拒绝后,需要调用远程服务,根据返回的值执行后续一系列操作,可是调用接口时间不可控

    常见的场景

    例如在第三方售票平台购票,它不会返回购票成功与否,而是先提示下单成功,等最终成功后会才发送短信提醒,不会让用户一直处于等待状态

    问题分析

    如果是做成同步,会造成以下影响

    1. 调用第三方服务的时长是不可控的,特别是如果你不清楚背后的逻辑。这样,用户会一直处于等待状态,造成不好的体验
    2. 所以,跨服务调用一定要小心,如果做成同步,需要设置等待第三方服务返回时长,事务回滚等

    异步解决方案

    1. 将需要调用第三方服务的订单id保存起来,给用户返回一个需要等待最终结果的状态
    2. 通过定时器去跑数据库里需要执行远程调用的id,最终改变订单状态
    3. 表设计
    # relative_id, event_type 可适应不同事件的id
    
    CREATE TABLE asynchronous_invocation_task
    (
      id           bigint(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
      relative_id  bigint(20) COMMENT '关联id',  
      event_type   tinyint(4) COMMENT '事件类型',
      status       tinyint(4) COMMENT '执行结果 0:成功 1:失败',
      is_calculate tinyint(4) DEFAULT '0' NOT NULL
      COMMENT '是否计算过,0:没计算 1:计算过 默认为0',
      create_time  datetime               NOT NULL
      COMMENT '创建时间',
      update_time  datetime COMMENT '更新时间'
    );
    CREATE INDEX unique_relative_event
      ON asynchronous_invocation_task (relative_id, event_type);
    

    如果你有更好的解决方案,欢迎留言讨论

    相关文章

      网友评论

          本文标题:异步调用场景

          本文链接:https://www.haomeiwen.com/subject/nlrruqtx.html