幂等性概念
数学中的定义:其任意多次执行所产生的影响均与一次执行的影响相同。比如f(f(x)) = f(x).
HTTP协议中的定义:在HTTP/1.1规范中幂等性的定义是:HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。其中GET,PUT, DELETE
如何测试幂等性
幂等性如此重要,那我们在具体的测试执行中该如何设计用例场景呢。主要有以下几种方法(有其他方法手段,欢迎补充)
-
前端重复快速点击(一般前端会做提交)
-
网络重发,比如在扫码支付时,商户在扫码时,先断网扫码一次再重连扫码
-
对同一笔订单,不同商户同时扫码
-
对同一笔业务并发请求,比如并发提现
-
Nginx重发情况(这种情况还没试过,要对nginx比较熟悉才行)
开发如何保障幂等性
1.insert前先select
2.加悲观锁
3.加乐观锁
4.加唯一索引
5.建防重表
6.更据状态机
7.加分布式锁
8.获取token
「去重」是对请求或者消息在「一定时间内」进行去重「N次」
「幂等」则是保证请求或消息在「任意时间内」进行处理,都需要保证它的结果是一致的
不论是「去重」还是「幂等」,都需要对有一个「唯一 Key」,并且有地方对唯一Key进行「存储」
去重 前端form表单提交按钮禁用时间,后端10s相同内容消息去重 强调下
「幂等」和「去重」的本质:「唯一Key」+「存储」
唯一key:「5分钟相同内容消息去重」,我直接MD5请求参数作为唯一Key。「1小时模板去重」则是「模板ID+userId」作为唯一Key,「一天内渠道去重」则是「渠道ID+userId」作为唯一Key…
「去重」,使用布隆过滤器