接口幂等性:发生一次接口调用与发生多次接口调用的接口消息都能得到与预期相符的结果
问题提出:为了提高通讯可靠性,通信框架/MQ可能会向数据服务推送多次相同的消息
//PUT https://xxx.com/employee/salary //{"id":"1","add_salary":1000} //查询员工1的信息 Employee employee = dao.selectById("1"); //更新员工薪水信息 employee.setSalary(employee.getSalary()+1000); //更新员工信息 dao.putdate(employee);
存在问题:上面接口逻辑,每重发一次员工1的薪水就会加1000,破坏了接口的幂等性
解决方案
代码增加前置判断(可根据调薪时间判断是否调薪)
if(!员工已调薪){ 调薪 }
不足:需要保证幂等性的接口过多,增加开发人员开发难度。无法保证开发人员都能考虑的设计接口的幂等性。
优点:接口个性定制化高。幂等表
token+redis
1.1 获取全局唯一token
接口处理生成唯一标识(token) 存储到redis中,并返回给调用客户端。
1.2 发起调薪操作并附带token
接口处理:
1.2.1 获得分布式锁(处理并发情况)
1.2.2 判断redis中是否存在token(使用删判断)
1.2.3 存在 执行业务逻辑,否则返回已经调薪
1.2.4 释放分布式锁CAS
update employee set salary = #{salary} ,status = 1 where status =0 and id = “1” //status = 0 待调薪 status = 1 已调薪
对于需要可逆场景 如调薪场景,需要额外设计定时任务获取前端接口进行status转变
如果是不可逆场景,如支付后订单状态。不许要额外处理
如何保证接口幂等性
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大...