异步调用场景

2019-03-01  本文已影响0人  Candy_糖果

工作问题

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

常见的场景

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

问题分析

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

  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);

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

上一篇 下一篇

猜你喜欢

热点阅读