使用“自旋”降低业务失败率

业务场景描述

不说废话,直接描述以下两个业务场景

  1. 使用分布式锁控制并发
    请求----------> 服务A
           [1.尝试获取锁]
           [2.获取锁失败]
           [3.返回失败(提示操作太快)]


2. 强依赖服务超时或”请求处理中”

请求----------> 服务A
          [1.强依赖请求]----------> 服务B
                           [2.执行慢(网络抖动等原因)]
          [3.请求服务B超时]   
          [4.返回失败(提示服务繁忙)]

问题描述

  1. 场景1在获取锁失败时直接返回业务失败,可以考虑二次尝试;
  2. 场景2因为服务B执行慢,直接返回上层失败。
    • 服务A重试请求服务B时,可能请求已经执行完,很快就返回成功;或者服务B仍在执行该请求,返回“执行中”错误码。

解决方案

  1. 场景1可以使用“自旋”减少失败率:在抢锁失败时,当前线程“自旋”100m以内的随机数,再二次获取锁;
  2. 场景2同样可以使用“自旋”减少失败率:服务A在请求超时或收到“执行中”错误码时,同样自旋后再次重试,较大概率得到成功结果。

扩展