工作问题
某个单子被拒绝后,需要调用远程服务,根据返回的值执行后续一系列操作,可是调用接口时间不可控
常见的场景
例如在第三方售票平台购票,它不会返回购票成功与否,而是先提示下单成功,等最终成功后会才发送短信提醒,不会让用户一直处于等待状态
问题分析
如果是做成同步,会造成以下影响
- 调用第三方服务的时长是不可控的,特别是如果你不清楚背后的逻辑。这样,用户会一直处于等待状态,造成不好的体验
- 所以,跨服务调用一定要小心,如果做成同步,需要设置等待第三方服务返回时长,事务回滚等
异步解决方案
- 将需要调用第三方服务的订单id保存起来,给用户返回一个需要等待最终结果的状态
- 通过定时器去跑数据库里需要执行远程调用的id,最终改变订单状态
- 表设计
# 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);
如果你有更好的解决方案,欢迎留言讨论
网友评论