业务场景描述
不说废话,直接描述以下两个业务场景
- 使用分布式锁控制并发
请求----------> 服务A [1.尝试获取锁] [2.获取锁失败] [3.返回失败(提示操作太快)]
2. 强依赖服务超时或”请求处理中”
请求----------> 服务A [1.强依赖请求]----------> 服务B [2.执行慢(网络抖动等原因)] [3.请求服务B超时] [4.返回失败(提示服务繁忙)]
问题描述
- 场景1在获取锁失败时直接返回业务失败,可以考虑二次尝试;
- 场景2因为服务B执行慢,直接返回上层失败。
- 服务A重试请求服务B时,可能请求已经执行完,很快就返回成功;或者服务B仍在执行该请求,返回“执行中”错误码。
解决方案
- 场景1可以使用“自旋”减少失败率:在抢锁失败时,当前线程“自旋”100m以内的随机数,再二次获取锁;
- 场景2同样可以使用“自旋”减少失败率:服务A在请求超时或收到“执行中”错误码时,同样自旋后再次重试,较大概率得到成功结果。
扩展
- 自旋同样需要考虑“比例”问题,不然大量自旋会影响服务的吞吐量,具体可参考:由灾备工作中引发的对“比例”的思考