如何解决分布式系统接口表单重复提交的问题,保证幂等性。
一、什么叫做幂等性
幂等性:在数学上的概念指的就是N次的变换等于1次变换,通俗一点就是,做很多次同样的事情和做一次是一样的效果。
二、重复提交
1、常见的场景
1、在我们商城系统中设计到的支付,当我们对一笔订单发起支付的时候,如果第一次支付请求了,系统扣款了,但是还没有给我们用户返回数据,用户以为卡了重复点击多次,这样就会多扣款,多次操作多种结果显然不是幂等性
2、在新增一条订单的时候,用户点击了多次新增按钮,每一次请求我们都会自动生成一个主键,插入了多条数据等…,多次操作多种结果显然不是幂等性。
2、有哪些请求设计到需要处理重复提交
在我们程序的设计中,简单的来说,我们服务端的业务逻辑都是CRUD(增删查改)。
1、对于查询来说:这个服务接口的内部不包含其他的操作,仅仅是读的操作,这种业务肯定是属于幂等性的要求的。
2、对于删除来说:你多次的删除并不会造成数据的错乱,但是又得系统要求你第一次删除成功了之后提示的还是删除成功,并不是资源不存在的说法。
3、对于新增和修改就会产生幂等性问题了。
3、如何解决新增、修改、幂等性问题
1、在新增或者删除的时候,在访问服务端接口的时候客户端除了基本数据之外多送一个addId/editId这样子标识表单的数据,服务端把数据存入缓存redis中,格式为key:addId/editId,value:操作返回的数据,这样如果多次提交我们先获取redis的key判断是不是同一次相同的操作,如果是则返回value的数据,这样就可以区分是不是多次点击提交按钮。
2、什么时候变换addId/editId呢,例如当表当数据清空的时候更新更新addId/editId。