一次线上请求数到一定量后报500,Time OUT异常的问题

接口地址(项目基于微服务)
merchant/api/merchants-get-bind-merchant-by-platform
问题复现通过postman压测
一次线上请求数到一定量后报500,Time OUT异常的问题
请求了24次以后接下来所有的请求报500
Exception in com.hpkj.merchant.web.rest.MerchantResource.getMerchantByBindPlatformWithState() with cause = ‘java.util.concurrent.TimeoutException’ and exception = 'PlatformService#platformBindMerchantByBrandWithType(Long,Long,Integer,Boolean) timed-out and no fallback available.'
定位到接口
platform/api/platform-bind-merchant-by-condition-with-type
再到
shop/api/get-platform/merchant-open-full-activity
初步定位到@RedisCache注解
一次线上请求数到一定量后报500,Time OUT异常的问题
将注解取消后压测正常
一次线上请求数到一定量后报500,Time OUT异常的问题
然后定位到问题在RedisTemplate,Redis连接的释放失败
一次线上请求数到一定量后报500,Time OUT异常的问题
RedisConnectionUtils.unbindConnection
此方法会判断当前是否使用了事务,如果使用了需要手动释放,redisTemplate执行完方法后将不会自动释放连接
一次线上请求数到一定量后报500,Time OUT异常的问题
详见https://my.oschina.net/lasipia/blog/1002640
看看redisTemplate的***核心方法excute(所有对redis数据的操作都是调用了此方法)***在finally调用了releaseConnection方法
一次线上请求数到一定量后报500,Time OUT异常的问题
一次线上请求数到一定量后报500,Time OUT异常的问题

所以按照逻辑redis在使用后已经释放了那为什么后面还是会造成未释放的故障,注意redisTemplate.getConnectionFactory().getConnection().getClientName()
会再次获得连接并且不会执行redisRedisTemplate的Excute方法,也就是说不会执行连接关闭的操作。
所以加一个释放连接的动作:
一次线上请求数到一定量后报500,Time OUT异常的问题