问题
压测一个接口过程中,导致这个接口的上游服务oom重启,但是直至压测结束,从压测结果上来看此接口的tps没有任何问题,压测过程中也没有接口超时的情况发生,上游服务重启原因是扛不住压力导致的,与研发确认被压接口有缓存机制,遂查看代码逻辑
问题排查
接口会在查询redis获取结果后判断此key是否超过了过期时间的一半,如果超过了就将此key存入队列异步请求上游服务来更新redis的缓存,问题产生原因在于大量请求中参数都是一样的,导致从redis中查询到即将过期的key也是同一个key,但是在往队列中存储的过程中没有对key进行去重,而且只要是判断key快过期就会放入队列中,所以最终导致的结果是在大量重复请求即将过期的key的情况下,和没有做缓存处理的结果是一样的,唯一的区别的是上游服务挂掉不会影响到被压接口的正常结果返回
补充
在压测用例的设计上由于使用了同一个参数且该参数已存在于redis中,导致在压测结果上没有发现上游服务的异常情况,如果压测用例使用的是redis中不存的参数即可发现上游服务的异常