幂等性解决方案
幂等性解决方案
幂等性就是同一个操作执行多次,产生的效果一样。多如此请求,多次消费不会造成程序逻辑异常。
保证幂等性的方法
前端
1 按钮只能点击一次 2 当用户提交表单后,执行一个客户端的重定向,即 Post_Redirect_get,避免用户刷新重复提交
后端
1 使用唯一索引,这样当数据重复的时候会无法插入。
2 状态机幂等 设计时最好只支持状态的单向改变,如订单状态有待支付,支付中,支付成功,支付失败,这样在更新时加上前置条件,多次调用只会执行一次。如把支付中的状态变为支付成功
update table set status =支付成功 where status=支付中
3 乐观锁实现幂等性
查询获取版本号
通过版本号更新,匹配则更新,不匹配则不更新
select version from table_name where user_id=10;
update table set money=money-10,version=version+1 where user_id=10 and version =1;
也可以通过乐观锁来管理超卖问题
update table set nm=num-10 where num-10>=0;
4 防重表 增加一个防重表,业务ID作为唯一索引,如订单号,当想针对订单做一系列处理的时候,可以向防重表中增加一个记录,插入成功则执行后续
操作,插入失败则不执行后续操作,本质上可以看成基于mysql实现的分布式锁。
5 分布式锁实现幂等性 执行方法先获取分布式锁,获取成功则执行,不成功则不执行。redis,zookeeper,mysql来实现
6 select+insert
先查一下有没有符合要求的数据,如果没有在执行插入,不太适用于高并发的场景
7 全局唯一实现幂等 通过来源+序列号来判断请求是否重复。
一致性哈希算法
一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设哈希函数H的值空间为0-2^32-1(哈希值是32位无符号整形)