应用的幂等是在分布式系统设计时必须要考虑的一个方面,如果对幂等没有额外的考虑,那么在消息失败重新投递,或者远程服务重试时,可能会出现许多诡异的问题。一起来看一下,在消息队列应用中,如何处理因为重复投递等原因导致的幂等问题。
文章目录
对业务幂等的理解
首先明确一下,幂等并不是问题,而是业务的一个特性。幂等问题体现在对于不满足幂等性的业务,在消息重复消费,或者远程服务调用失败重试时,出现的数据不一致,业务数据错乱等现象。
幂等最早是一个数学上的概念,幂等函数指的是对一个函数或者方法,使用相同的参数执行多次,数据结果是一致的。
以 HTTP 协议为例,我们知道 HTTP 协议中定义了交互的不同方法,比如 GET 和 POST,以及 PUT、DELETE 等,其中 GET、DELETE 等方法都是幂等的,而 POST 方法不是。
这个很好理解,GET 方法用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的,DELETE 等可以类比。
这里有一点需要注意,业务上的幂等指的是操作不影响资源本身,并不是每次读取的结果都保证一致。比如通过 GET 接口查询一条订单记录,在多次查询的时间段内,订单状态可能会有新的更新而发生变化,查询到的数据可能不同,但是读接口本身仍然是一个幂等的操作。
在业务开发中对数据的操作主要是 CRUD,即在做数据处理时的 Create、Read、Update、Delete 这几种操作。很明显,这里的 Create 操作不是幂等的,Update 操作可能幂等也可能不幂等。例如,现在有一个订单表,下面的操作就是幂等的: