在分布式系统中,由于网络延迟和错误重试,一个操作可能被多次调用执行。如果没有正确设计,就可能导致数据的重复修改或者异常情况。所以幂等性设计是分布式系统一个重要的考点。
常见的幂等性设计有:
- 使用唯一标识符防止重复提交
例如给每次操作赋予一个唯一的流水号uuid,在执行操作前先检查是否已经有这个uuid的操作。
- 使用版本号机制防止重复修改
例如给数据添加一个版本号version字段,在更新时加上version作为条件,保证同一时间只允许一个版本的修改。
- 将非幂等操作结果写入持久化存储
例如将修改结果写入数据库,保证即使重复调用也只会有一次实际效果。
- 使用消息队列防止重复消费
例如将任务放入队列中,使用消费者Acknowledge机制告知队列该任务已被执行,防止重复消费。
-
使用限流来保证调用频率的幂等性。比如每秒只允许一定数量的调用。
-
对幂等操作结果进行幂等检查。比如对更新后的数据进行校验,检查是否真正发生了变更。
-
将幂等操作封装成事务进行。比如使用分布式事务框架将一组幂等操作打包成一个原子事务。
-
对敏感资源设置重复调用过滤时限。比如重复调用间隔不能低于1秒,避免在时间窗口内重复执行。
-
使用请求和响应中带上的调用链路信息进行幂等检查。比如检查请求Id是否重复。
-
对部分不可重入操作使用锁机制。比如使用分布式锁保证同一时间只允许一个线程执行。
-
对幂等和不幂等操作进行明确区分和分类。不幂等操作需要进行结果缓存或者写入持久层。
-
结合应用业务特性进行幂等设计。比如某些更新操作本身就是幂等的。
-
在调用链路中追加调用记录并进行幂等检查。比如调用日志中检查是否有重复记录。
以上给出了分布式系统幂等性设计的一些其他方法,面试时可以介绍这些思路来回答面试官的进一级问题。