背景介绍:
比如一个注册接口,要求填入的手机号与DB中已有的不能重复,
如果手机号码重复,则此次注册失败,不会新增会员数据;
如果不重复,则注册成功(忽略其他因素)。
但是用20个并发,同样的请求,请求body中手机号码完全一样,一起进行注册,接口会怎样?
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...
如果接口没有考虑幂等性,会导致上述的20个请求,处理结果是大于1条的数据成功插入DB中,且发现手机号码再DB中重复了;
我们做接口功能测试的时候,比如注册接口,异常请求是,请求注册的手机号存在DB中,验证返回xxx且注册不成功。功能测试的时候,单个这个的请求,代码的确能处理,遇到多并发的时候,可能就处理不好了。
说白了,就是有bug。
首先思考一下接口的幂等性对接口的影响?
如果是查询接口,select语句,那不会影响DB中的数据;
如果是新增接口,insert语句,必然影响;
如果是更新接口,update语句,将某个字段更新的时候。。。。。。
请问要怎么解决?
请不要回答加思考时间等,此问题是问架构或者注册数据要怎么存入DB
https://www.cnblogs.com/qianjinyan/p/9051862.html
我之前遇到的case,20个请求同时成功,DB中新增了20个手机号码为一样数据的人。
查询的时候DB中还没有此手机号,但是注册的时候,在同时的时间,
一致性的问题怎么解决?
不要告诉我,mobile字段用bigint数据类型,还不能重复的限制deal with在了DB中~~
我们生产上的系统遇到过这个问题,会员通过微信小程序注册,注册成功了,后来立即收到两条短信,短信里面含有注册卡号;
我作为测试,重现了场景,对PM说,我们接口没有做成幂等性的接口;
PM看我的眼神