什么是幂等性?如何保证接口的幂等性?
什么是幂等性:
幂等性是数学中的一个概念,后来被广泛用于计算机行业分布式系统中。表示多次请求和一次请求的结果相同。
举个例子:小杨在某电商平台购物,订单支付时手抖了一下,点了两次支付按钮。如果服务器没有做任何限制,那么就会触发两次支付操作,小杨的钱就被扣了两次,如果发生这种情况。客户被气死,平台被投诉,用户会流失..那为了避免这种情况发生,一般就需要完善电商平台,保证对应的接口的幂等性,即使小杨使用筋膜抢去点击支付按钮,那最终的支付结果也只会进行一次扣款支付。
如何保证幂等性:
一般有四种方式来保证接口的幂等性:
- 通过前端拦截处理
- 通过数据库的方式
- 通过JVM加锁的方式
- 通过分布式锁的方式
1.通过前端拦截处理:
前端拦截是指通过 Web 站点的页面进行请求拦截,比如在用户点击完“提交”按钮后,我们可以把按钮设置为不可用或者隐藏状态,避免用户重复点击。
优点:处理相对简单。
缺点:如果懂技术的同学可以绕过前端,可以绕过前端发送模拟请求到服务器,这样前端的拦截就失效了。
2.通过数据库方式实现
数据库实现幂等性的方案有三个:
通过悲观锁来实现幂等性
通过唯一索引来实现幂等性
通过乐观锁来实现幂等性
缺点:不适合分布式系统
3.JVM
JVM 锁实现是指通过 JVM 提供的内置锁如 Lock 或者是 synchronized 来实现幂等性。
JVM 锁存在的最大问题在于,它只能应用于单机环境,因为 Lock 本身为单机锁,所以它就不适应于分布式多机环境。
缺点:不适合分布式系统
4.分布式锁的方式
分布式锁实现幂等性的逻辑是,在每次执行方法之前先判断是否可以获取到分布式锁,如果可以,则表示为第一次执行方法,否则直接舍弃请求即可。