什么是幂等
多次调用同一方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
接口幂等能解决什么问题
- 前端重复提交
- 接口超时重试
- 消息重复消费
解决方案
- token机制:
- 客户端从服务端获取token,然后发送指定请求,服务端将生成的token放入redis
- 客户端携带token去做业务请求,服务端判断token是否在redis中,不在则拒绝,在则删除token(或者给打个标识),并进行业务处理
- 该token是全局唯一的,可以使用一个全局的id生成服务来生成(snowflake算法的一个变种)
- 基于mysql的实现
- 利用mysql的唯一索引,只有在负载比较小的情况下,才合适
- mysql的悲观锁 `select * from xxx where id = ‘xx’ for update; 需要注意使用主键或者唯一索引,否则锁表。
- mysql的乐观锁 ,基于版本号,如update xxx set xx=xxxx, version=version+1 where version=#version#;或者条件,如update table_xx set x = xxx+a where x = xxx;
- 基于redis的setnx
- 如果设置成功,说明是第一次设置,如果失败,说明已经设置过了,直接返回相关信息。
- 状态机幂等
- 订单号绑定状态,放redis中,状态只能有序地向下个状态走;
- 对外暴露的接口
- 来源source+ 来源唯一序列号,每次处理前先查询下是否处理过该笔业务。可以是redis,也可以是数据库。数据库做唯一索引,多一层保障。
Be First to Comment