异步三方接口调用

优化异步三方接口调用

问题原因:

三方接口可能会出现网络波动,外部依赖的服务,直接影响到了页面的稳定性表现,出现检验之后一直加载,超时之后再点击就会很快就完成验证。

背景

人员手机号验证功能。当时我们发现,三方接口的稳定性不高(可能是由于网络波动或者其他原因),并且三方接口还会有每秒中的请求限制。导致人员检验时会有超时,甚至是检验失败等情况,但是重复点击就会成功。
排查下来发现,外部依赖的服务,直接影响到了平台的稳定性表现。
改造前

  • 同步接口

  • 耗时长

  • 超时多,稳定性差

  • 重试可解决

设计

异步化改造

​ 由于重试可解,所以抽取了一个检验中的中间状态。SubmitDetectionService 的 SubmitDetection方法中,设置状态为检验中,异步调用trySubmitDetection方法。执行实际送审

public interface SubmitMaterialUnitService {
    /**
     * 提交物料单元
     *
     * 先修改状态为审核中,返回
     * 异步处理提审过程,失败则在日志表中进行记录
     *
     * @param muId 物料单元
     * @param info 提交时所需的补充信息,如代理商、订单级别等
     */
    void SubmitDetection(Long muId, ExtraSubmitInfo info);

    /**
     * 提交物料单元,不会再进行免审校验
     * 用于异步提交,以及定时任务扫日志表重试提审
     */
    void trySubmitDetection(Long muId, ExtraSubmitInfo info);
}
异常处理

为了避免异步处理失败从而造成实际未送审,在 trySubmitDetection中,我们进行异常捕获,将处理失败的请求落入 event_log

重试任务

RetrySubmitTask 每隔10分钟定时扫 event_log 表,重试检验数据

报警时机管理

设置了两处报警点

  • event_log 入库失败时(AbstractEventLogDealHandler)
  • 重试任务失败时(MaterialUnitRetrySubmitTask)
    如果 event_log 入库成功,不会触发报警,因为我们已经有重试任务了,所以此刻的报警没有意义
  • 同时日志表中有次数字段,如果调用三次以上依旧失败,则放弃掉这条消息,并且发送消息告知开发人员进行人工介入
成果

改造后

  • 异步
  • 耗时短
  • 稳定性提升
  • 系统自动重试,取代手动重试
思考
  1. 异步化改造可提升系统性能与稳定性
  2. 需要配合相应保障机制,重试、报警,或者一致性监控
  3. 三方接口稳定性差,但无业务报错的情况下,可以不引入新状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值