分布式:浅谈幂等

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,"getUsername()和 setTrue()"函数就是一个幂等函数。简言之:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。

一、幂等有哪些技术解决方案

1、查询操作

查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select 是天然的幂等操作。

2、删除操作

删除操作也是幂等的,删除一次和多次删除都是把数据删除。注意:可能返回结果不一样,删除的数据不存在,返回 0,删除的数据多条,返回结果多个。

3、唯一索引

防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建多个资金账户,那么给资金账户表中的用户 ID 加唯一索引,所以一个用户新增成功一个资金账户记录。

要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可。

4、token 机制

防止页面重复提交。

业务要求:页面的数据只能被点击提交一次;

发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交;

解决办法:

(1)集群环境,采用 token 加 redis(redis 单线程的,处理需要排队);

(2)单JVM环境,采用 token 加redis或token加 jvm 锁。

处理流程:

(1)提交前,向服务申请 token,token 放到 redis 或 jvm 内存,token设置有效时间;

(2)提交后,后台校验 token,同时删除 token,生成新的 token 返回。

token 特点:要申请,一次有效性,可以限流。

注意:redis 要用删除操作来判断 token,删除成功代表 token 校验通过。

5、 TraceId

操作时TraceId是唯一的。

二、对外提供的API如何保证幂等

举例说明: 银联提供的付款接口,为了支持幂等调用,需要接入商户提交付款请求时附带source 来源,seq 序列号。source+seq 在数据库里面做做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。

注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,因为实际已经处理。

相关推荐
跟着珅聪学java13 小时前
在电商系统中,如何确保库存扣减的原子性
分布式
JH307315 小时前
Redisson 看门狗机制:让分布式锁“活”下去的智能保镖
分布式
一点 内容16 小时前
深入理解分布式共识算法 Raft:从原理到实践
分布式·区块链·共识算法
8Qi816 小时前
分布式锁-redission
java·redis·分布式·redisson
17 小时前
鸿蒙——分布式数据库
数据库·分布式
Hui Baby17 小时前
分布式多阶段入参参数获取
分布式
阿拉斯攀登20 小时前
Spring Cloud Alibaba 生态中 RocketMQ 最佳实践
分布式·微服务·rocketmq·springcloud·cloudalibaba
无锡布里渊20 小时前
感温光纤 DTS 系统 vs 感温电缆 对比分析报告
分布式·实时监测·分布式光纤测温·线型感温火灾监测·感温电缆
g323086320 小时前
分布式框架seata AT模式源码分析
java·数据库·分布式
哇哈哈&20 小时前
如何进行卸载rabbitmq
分布式·rabbitmq