一、概念:
幂等的的意思就是一个操作不会修改状态信息,并且每次操作的时候都返回同样的结果。即:做多次和做一次的效果是一样 的。
二、使用场景
幂等性问题在我们开发过程中、高并发、分布式、微服务架构中随处可见的,具体举例以下几个经常遇到的场景
-
网络波动
因网络波动,可能会引起重复请求
-
MQ消息重复
生产者已把消息发送到mq,在mq给生产者返回ack的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成mq接收了重复的消息。
-
用户重复点击
用户在使用产品时,可能会误操作而触发多笔交易,或者因为长时间没有响应,而有意触发多笔交易。
-
应用使用失败或超时重试机制
为了考虑系统业务稳定性,开发人员一般设计系统时,会考虑失败了如何进行下一步操作或等待一定时间继续前面的动作的。
三、 哪一层实现幂等
目前互联网技术架构基本都是分布式、微服务架构,层次分的也比较清晰,如
-
第一层:APP、H5、PC
-
第二层:负载均衡设备(Nginx)
-
第三层:网关层(GateWay)
-
第四层:业务层(Service)
-
第五层:持久层(ORM)
-
第六层:数据库层(DB)
那到底在哪一层实现幂等呢?
一般网关层主要的任务是路由转发、请求鉴权和身份认证、限流、跨域、流量监控、请求日志、ACL控制等。如果在网关层实现幂等性,那需要把业务代码写在网关层,这种做法一般在设计中是很少推荐的,所以不适合
业务层主要是处理业务逻辑,对查询或新增的结果进行一些运算等,所以也不合适
持久层也叫数据访问层,和数据库打交道,这块不做幂等性的话,可能对数据产生一定影响,所以这一层是需要作品幂等性校验。
通过以上分析我们得知幂等性一般在持久层去实现。
四、解决方案
-
前端幂等性控制
1、按钮只能点击一次
如用户点击查询或提交订单号,按钮变灰或页面显示loding状态。防止用户重复点击。
2、token机制
产品允许重复提交,但要保证提交多次和一次产生的结果是一致的。
具体实现是进入页面时申请一个token,然后后面所有请求都带上这个token,根据token来避免重复请求。见下图