文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

实现业务幂等性的常用方案!

2024-11-28 16:07

关注

生产环境经常出现重复的数据,而这个绝大部分原因是发生了重复的请求。

重复请求是指同一个请求因为某些原因被多次提交。

导致这个情况会有几种场景:

微服务场景

用户交互的时候多次点击,如:快速点击按钮多次。

MQ消息中间件:消息重复消费。

第三方平台接口:因为异常也会导致多次异步回调。

幂等性定义

如上,针对重复请求,我们在设计某些接口时,要考虑如何保证接口幂等

那什么是接口幂等呢?

定义:多次调用对系统的产生的影响是一样的,即对资源的作用是一样的,但是返回值允许不同。

比如支付场景:

用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了。

用户再次点击按钮,此时会进行第二次扣款,返回结果成功。

幂等场景

查询

新增

修改

删除

总结:新增没有唯一主键约束的数据,和计算赋值更新操作都不具备幂等性。

直接赋值:

update user set num = 20 where userid=123;

计算赋值:

update user set num = num + 20 where userid=123;

幂等性方案

悲观锁

id字段一定是主键或者唯一索引,不然可能造成锁表的结果。

select * from user where id = 1 for update;

乐观锁

加上了版本号后,计算赋值更新场景,具备了幂等性。

缺点:

update user set  num= num + 20, version = version + 1 where userid=123 and version=1;

唯一约束

利用数据库的主键唯一约束的特性,解决在insert场景时幂等问题。

去重表

把唯一主键插入去重表,再进行业务操作,且他们在同一个事务中。

去重表和业务表应该在同一库中,这样就保证了在同一个事务,即使业务操作失败了,也会把去重表的数据回滚。

去重表是跟业务无关的,很多业务可以共用同一个去重表。

图片图片

分布式锁

如果多个机器可能在同一时间同时处理相同的数据:

就可以加分布式锁,锁定此数据,处理完成后释放锁。

Token机制

图片图片

服务端提供了发送token的接口。

在执行业务前,先去获取token,服务器会把token保存到redis中。

服务器判断token是否存在redis中,存在表示第一次请求。

如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client。

缺点

业务请求每次请求,都会有额外的请求:

真实的生产环境中,1万请求也许只会存在10个左右的请求会发生重试。

逻辑实现:

可以通过自定义注解将进行改造。

图片图片

总结

幂等性是系统服务对外一种承诺,特别业务中涉及的钱的部分,一定要慎重再慎重。

虽然前端做限制会更容易点,但前后端都需要做努力。

来源:月伴飞鱼内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯