幂等性
幂等性发生场景
1 前端重复提交表单
前端用户填写完成提交,有时因网络波动没有及时对用户的提交做出响应,导致用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
2 用户恶意进行刷单
例如用户投票,恶意提交订单
3 接口超时重复提交
例如调用第三方调用接口,为了防止网络波动超时,都会添加重试机制,导致一个请求提交多次。
4 消息重复消费
消息中间件出现错误,导致发生同一个消息被重复消费。
幂等性解决方案
前端拦截
用户点击完“提交”按钮后,把按钮设置为不可用或者隐藏状态,避免用户重复点击。(如果黑客绕过js,这时需要后端实现幂等性校验)
数据库
1 通过唯一索引或者唯一主键
如果重复插入会触发唯一约束而导致插入失败,就可以判定它为重复提交的请求。这个唯一字段一般是业务ID,如果是主键则可以使用分布式ID,不能是数据库自增ID。
2 通过乐观锁来实现幂等性
token机制
当用户发起请求之前,先获取后端生成的一个存储在redis中的token。当用户向后端发送请求的时候,需要携带此token,然后后端在redis中判断是否存在token,如果存在就删除token并且执行操作,如果不存在就说明当前已经有相同的请求被执行过。