同一请求在短时间内进行多次相同请求,出现这种情况有很多,如用户多次点击发送请求、模拟请求、服务端处理慢时客户端的重请求。
这类请求的特点:
1.多次请求的时间间隔非常短,一般在几十毫秒之内(正常请求在几十毫秒内处理完成)
2.请求信息相同,造成业务方重复处理。
解决办法:
前端:做防重处理
后端:
1.数据库锁,对涉及的业务使用数据库层面的锁,如悲观锁或乐观锁,缺点:对请求重复处理
2.分布式锁,根据限制条件处理请求,优点:简单,处理高效,缺点:占用缓存资源
3.请求token机制,进入请求页面时分配业务token,当请求时携带业务token,服务端进行判断该请求是否重复,如重复则按失败处理,优点:简单,处理高效,缺点:占用缓存资源
3.业务幂等,可以接收重复请求,返回一致的处理结果,缺点:对请求重复处理
4.异步操作,将写操作做异步处理,如全部写入消息队列中,将并行处理变为串行处理。
优点: 极大的提高系统吞吐量,因为只有一个写入消息队列的操作,将处理的操作变为串行,保证了写入的顺序性
缺点:1.引入了其他复杂度,需要考虑MQ的高可用 2.将并行操作变为串行,仍然会占用计算资源 3.将请求结果改变,客户端无法立即获取请求结果,需要重新请求获取结果。