For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
java编程开发随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,java编程幂等性概念与实现方法分享。
1、幂等性
一句话,幂等就是一个执行操作,无论执行多少次,产生的效果和返回的结果都是一样的。
2、为什么要实现幂等性?
如今随着互联网技术快速发展,业务越来越复杂,系统的高并发和关键数据的场景越来越多。
在分布式系统中,机器宕机和消息丢失也是需要重点关注的问题,其中的一个就是幂等性问题。
想想看,一个对外暴露的接口会面领很多次请求,如果不能保证幂等性会带来什么样的后果?
微信进行一次扣款操作,应该只扣用户一次钱,当遇到网络故障或系统bug,如果没有实现幂等性扣多了你会不会直接“C语言”投诉?
当然,有些接口是天然保证幂等性的,比如查询操作、删除操作。有些对数据的修改是一个常量,无其他操作,也是具有幂等性的。修改操作可能幂等可能不幂等。
POST请求天生就不是一个幂等操作,每次调用都会在系统中产生新的资源,想要幂等就必须在业务中实现。
需要避免的是,幂等性和并发安全不是一回事。当同一笔订单即使你不停的提交支付,如果扣了不止一次钱,就说明该操作不幂等。
而有多笔订单同时进行支付,后扣除的金额不是这么多笔金额的总和,说明该操作有并发安全问题。这是两个维度的问题,应该分开讨论解决。
3、如何实现幂等性?
(1)数据库防重
利用数据表索引的特性,当并发时新增报错时,再查询一次,数据已经存在,就避免了脏数据的新增。但注意,不要将uuid作为索引字段,其大小和类型对于索引而言都会导致速度非常慢。
常见的场景,比如博客/微博系统点赞,一个用户对一个微博点赞,就把用户id与该博文id绑定,后续该用户再对该博文点赞就无法插入。再比如金融账户,可以通过在账户表中增加索引来存储用户id,即使重复操作一个用户也只能拥有一个账户。
(2)token令牌机制
token机制是适用范围广泛的一种幂等设计。虽然实现方式有很多种,但核心思想就是每次操作都生成一个token凭证,服务器通过这个凭证确保同样的操作不会被执行多次。
具体可以分为两个阶段,获取token和使用token。每次接口请求前先获取一个token,然后在下次请求时在请求的header体中加上这个token,后端进行校验,如果验证通过则删除token,下次请求再次判断token。
(3)分布式锁
数据库防重表可以通过分布式锁代替,相比去重表,将放并发做到了缓存中,效率更高。局限性都是同一时间只能完成一次请求。
比如某些业务处理流程很长,要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁。
4、幂等的优缺点
优点:
业务需要
缺点:
(1)客户端处理逻辑得以简化,但服务端控制幂等逻辑变得更加复杂;
(2)把并发执行变成改为串行执行,降低了执行效率。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。