幂等性解决方案
幂等性要求的场景:
1、表单提交,重复点击问题,产生两条相同数据。
2、接口超时重试,出现重复操作数据问题。
3、mq消费者读取消息,读取重复消息问题。
接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致。
如何解决请求重复,就需要接口的幂等
幂等解决方案:
1、分布式锁:
insert前进行select,例如用户注册,相同账号提示错误。查询到插入业务需加锁控制。
加锁,redis进行分布式锁处理,有一种说法,redis集群是AP架构,怎么能保证CP(一致性),这不是自相矛盾吗,这么较真儿可以用ZK替换redis。
请求账户设置为锁key。相同请求则第二次请求直接返回。
次场景适用于,请求需唯一标识,如各支付平台,请求号唯一,相同请求号第二次请求直接返回错误。
2、使用token方案。
两个请求完成同一件事。
接口1请求token
接口2请求,带上接口1请求token,同样token存到redis中。验证token成功,删除token进行后续操作。第二个请求,此时token已删除,直接返回错误。
3、主键,唯一索引,数据库方面直接幂等
/**
* 幂等处理
*/
Rsp idempotent(Request req){
Object requestRecord =selectByBizSeq(bizSeq;
if(requestRecord !=null){
//拦截是重复请求
log.info("重复请求,直接返回成功,流水号:{}",bizSeq);
return rsp;
}
try{
insert(req);
}catch(DuplicateKeyException e){
//拦截是重复请求,直接返回成功
log.info("主键冲突,是重复请求,直接返回成功,流水号:{}",bizSeq);
return rsp;
}
//正常处理请求
dealRequest(req);
return rsp;
}