什么是幂等性
在后端开发中,我们会经常听到一个词叫幂等性,究竟什么是幂等?幂等对于后端接口,实际业务有多重要呢?在这篇博客,我将和大家一一分享。
在微服务架构下,我们先来看这样一个场景:
- 小明在网站上购物并支付,这时客户端向后端发送一个支付请求。
- 在后端响应这个支付请求,发生了扣钱操作,但是接口相映超时了(可能是由于网络抖动或者其他事务失败)。
- 客户端发现第一次的扣钱请求超时,进行重试,再一次发起了支付请求。
这个时候就会出现一个问题,我们如何保证扣钱这个操作只进行了一次?微服务架构下,服务之间的调用增多,类似这种场景出现的问题就会比单体架构多得多。为了解决这个问题,开发人员在实现接口的时候就需要保证接口的幂等性。通俗来说,幂等性就是接口可重复调用,并且在多次调用后得到的结果是一样的。比如对于支付接口,调用1次和调用10次得到的结果都应该是只扣除了1次的钱。需要注意的是,有些接口是天然幂等的,如查询接口。但是涉及到增删改的接口就需要手动保证幂等性。下面就介绍几种实现幂等性的方法。
如何实现幂等性
全局唯一ID
这是一个比较通用的做法,根据业务的操作去生成一个全局唯一的ID,存放到数据库或者Redis中,这样在每一次调用时都可以到DB或Redis中查这个ID是否存在来判断操作是否重复进行。这个好处是对于比较庞大的微服务架构来说,有全局的信息,比较直接。缺点是涉及到了DB或Redis的读写,也会受到相应抖动的影响。
去重表
这种方法并不是通用的,但是很多业务场景下都能够使用。以订单支付为例,因为每一张订单只能支付一边,所以订单本身的ID也就是支付这个操作的唯一ID,我们可以利用这个特性,在每一次支付的时候去查询订单表,如果有存在的订单则忽略该次请求。
其他方法
当然实际应用中还有非常多实现幂等性的方法,如借助数据库的唯一索引等,去保证操作的唯一性。