幂等技术是为了保证唯一性,保证同一个请求只被处理一次。处理幂等的技术有多种,本文我们就来看看如何基于幂等表来做幂等处理。
基于幂等表的方式,我们需要在数据库专门建立一个幂等表,表结构可以如下:
id,module,code
基于上面幂等表我们看看方案一幂等处理流程:
当同一个请求(moudle和code一样)多次过来后,会先执行步骤1插入幂等记录,介于唯一性约束,只有一个请求会插入成功,其他请求会抛出唯一键冲突异常。这保证了步骤2只会执行一次。
上面方案看起来可行,但是考虑如果步骤一执行OK,在执行步骤2时候机器挂了,则会导致幂等记录不能被删除,这样会导致重复的请求过来后被幂等掉,从而导致请求被漏处理。
幂等处理流程:
不同于方案一,方案二让插入幂等记录和业务处理放到了一个事务内。这样当业务逻辑执行完成,则把幂等记录插入db,执行失败则回滚幂等记录。
那么一个问题是,开启事务本身是有开销的,是否可以在开启事务前先select一把,看看是否存在幂等记录,存在则直接返回那?这时候幂等流程为:
这种方案是可行的,但是要看具体场景,如果需要被幂等掉的请求比较少,那么就没必要先select一把,因为事务外加select会导致所有请求都select一把。如果需要被幂等的请求量比较大,那么事务外先select一把是不错的选择。
本文我们概要介绍了,基于幂等表进行幂等处理的方式。