什么是请求重放
- 由于网路原因或未知异常导致的客户端不断向服务端重试同一个请求的行为可以叫做请求重放。
可能导致的问题
- 请求重放可能会导致出现的一些问题有:数据重复、数据不一致、服务端接口被恶意攻击直至崩溃。
常见的业务场景
- 分布式场景下,使用dubbo框架,dubbo微服务间接口请求处理响应超时后,调用方默认会发起请求重试;
常见的解决方案
- 加随机数。
- 加时间戳。
- 加流水号
基于redis实现的一种解决方案(随机数原理)
- 根据 参数、方法名全路径 进行格式化成json串,然后对json串进行md5加密,得到md5随机数;
- 将得到的md5随机数作为key,去redis中判断该key是否存在?
- 如果存在说明是重复请求;
- 如果不存在说明不是重复请求,将该key放到redis中,设置超时时间(按实际业务来定);
- 注意:设置key要使用redis乐观锁方式,因为在设置key的时候可能会存在并发问题:比如两个相同参数的请求同时进来,都判断redis中没有key,都认为是重复请求,则会被处理两次
- 注意:这个方案实现中,接口参数中一定也要包含一个随机数参数,否则参数很可能会是重复的呀,我们进行md5加密其实主要是想减短redis key的长度大小,因为参数可能很长,这个不容易把控。