上个月线上生产环境有几个接口出现异常响应,查看生产日志后发现,如下错误

线上Redis客户端使用的是SpringBoot默认的Lettuce客户端,并且没有指定连接池,connection reset by peer这个错误是当前客户端连接在不知情的情况下被服务端断开后产生,也就是说当前客户端Redis连接已经在服务端断开了,但是客户端并不知道,当请求进来时,Lettuce继续使用当前Redis连接请求数据时,就会提示connection reset by peer

一般情况下服务端断开连接都会发送FIN包通知客户端,但是当我在用tcpdump监控服务端tcp传输后,发现Redis服务端tcp连接在无活动一段时间,比如10分钟后会收到来自客户端的RST包,然而我的客户端也在使用wireshark抓包中,并没有发送给服务端RST包,这就很奇怪了,猜测这里是可能是服务器对tcp连接的限制导致,对长时间无活动的tcp连接强制断开处理。所以这里线上环境Redis连接偶尔产生connection reset by peer错误是被我复现出来了。

既然这里知道是Redis连接长时间无活动后被断开导致的bug,那怎么解决?

博主一开始以为重试可以解决,但是发现事情没有想象的简单。上代码

   // 查询Redispublic <T> T getCacheObject(final String key) {try {ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);} catch (Exception e) {log.error(e.getMessage(), e);return retryGetCacheObject(key, 3);}}// 重试查询Redispublic <T> T retryGetCacheObject(final String key, int retryCount) {try {log.info("retryGetCacheObject, key:{}, retryCount:{}", key, retryCount);if (retryCount <= 0) {return null;}Thread.sleep(200L);retryCount--;ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);} catch (Exception e) {log.error(e.getMessage(), e);return retryGetCacheObject(key, retryCount);}}

上面代码的意思是第一次查询Redis发生异常后,每隔200毫秒在查3次。当实际运行时,发现这里会提示三次connection reset by peer错误,一直没有取到新的Redis连接。

到这里这个问题的我的解决思路其实就是怎么在Redis连接发生异常后,怎么创建一条新的连接进行代替。

不多说直接上代码:

    // Lettuce连接工厂@Autowiredprivate LettuceConnectionFactory lettuceConnectionFactory;/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public <T> T getCacheObject(final String key) {try {ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);} catch (Exception e) {log.error(e.getMessage(), e);return retryGetCacheObject(key, 1);}}public <T> T retryGetCacheObject(final String key, int retryCount) {try {log.info("retryGetCacheObject, key:{}, retryCount:{}", key, retryCount);if (retryCount <= 0) {return null;}lettuceConnectionFactory.resetConnection();Thread.sleep(200L);retryCount--;ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);} catch (Exception e) {log.error(e.getMessage(), e);return retryGetCacheObject(key, retryCount);}}

在用当前Redis连接获取数据发生异常超过timeout间隔后,抛出异常,进入重试方法,使用 lettuceConnectionFactory.resetConnection()方法进行连接重置,创建一条新的连接后,继续获取数据,从而正常响应客户端。lettuceConnectionFactory对象是对Lettuce无池化连接的工厂实现,提供了 lettuceConnectionFactory.getConnection(); lettuceConnectionFactory.initConnection(); lettuceConnectionFactory.resetConnection();等获取、初始化、重置连接的方法

配合springboot配置timeout将获取数据的超时时间设置为2秒,从而将接口请求耗时也控制在2秒左右

  redis:xx: xxtimeout: 2000

到此生产环境这里SpringBoot项目下Lettuce客户端无池化连接偶尔断开的bug算是解决了

最后贴一下实战项目地址newbeemall,newbee-mall商城的mybatis plus版本 实现了优惠卷领取, 支付宝沙箱支付,后台添加搜索,RedisSearch分词检索

生产环境Redis连接,长时间无响应被服务器断开问题相关推荐

  1. pip安装librosa或audioread长时间无响应

    环境:python3.6 公司内网pip安装librosa长时间无响应,其实是卡在了依赖audioread上,如果等得足够耐心就会等到如下报错: Could'n find index page for ...

  2. ArcGIS 注册版本长时间无响应处理案例

    最近碰到一些客户注册版本长时间无响应的情况,现将解决步骤记录一下: 症状详细描述: 这些用户要注册的都是包含比较多图层的数据集,都是长时间无响应,几个小时,甚至10-20个小时. 如果此时杀掉Desk ...

  3. jedisPool.getResource()方法长时间无响应并且不报错

    一个Java Web的系统需要动态根据Redis地址获取数据,截取相关代码如下: 获取连接的方法: public static JedisCluster getConn(String host, in ...

  4. .net跨防火墙链接oracle连接池链接长时间无通讯数据被断开后报错问题解决

    环境: .net 4.0以上使用Oracle.ManagedDataAccess组件链接oracle数据库,应用程序与数据库之间存在硬件防火墙. 症状:应用程序启动后正常访问,如果出现长时间无数据库请 ...

  5. win11安装SolidWorks激活时闪退,长时间无响应

    在win11系统上安装完solidworks后单击激活软件SW2010-2016.Activator.GUI.SSQ,这时会出现两种状况: 激活软件闪退 激活软件长时间没有反应 这两种错误有时会出现1 ...

  6. 被远程机器长时间无响应 (错误码:[308])_自动折叠式“Rollbot”为完全不受束缚的软机器人铺平了道路...

    如今,大多数软机器人依靠外部电源和控制,使它们与车外系统连接或用硬件组装.现在,来自哈佛大学约翰·保尔森工程与应用科学学院(SEAS)和加州理工学院的研究人员开发了受折纸结构启发的软机器人系统,可以根 ...

  7. QQ浏览器该站点长时间无响应_图解浏览器的基本工作原理

    前言 可能每一个前端工程师都想要理解浏览器的工作原理. 我们希望知道从在浏览器地址栏中输入 url 到页面展现的短短几秒内浏览器究竟做了什么: 我们希望了解平时常常听说的各种代码优化方案是究竟为什么能 ...

  8. 物联网网关神器 Kong ( 四 )- 利用 Konga 来配置生产环境安全连接 Kong

    物联网网关神器 Kong ( 四 )- 利用 Konga 来配置生产环境安全连接 Kong 前言 上一篇我们讲解了 Konga 的搭建和与 Kong 进行默认连接,本篇文章将讲一下如何在生产环境中基于 ...

  9. 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题

    使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 参考文章: (1)使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 (2)https://www.cnblogs. ...

最新文章

  1. JavaScript中处理日期的一些函数和方法
  2. c# 之Web.config
  3. 多线程java_Java多线程基础
  4. 实现ABAP条件断点的三种方式
  5. android照片编辑软件,照片编辑免费软件下载-照片编辑软件app下载 v7.45最新版_5577安卓网...
  6. php怎么写for循环,PHP for循环的写法和示例
  7. 钉钉老版本下载3.31_钉钉旧版pc下载-钉钉旧版pc客户端下载-西西软件下载
  8. 真香!8 行代码搞定最大子数组和问题
  9. Javascript對表格的操作[知識積累帖]
  10. 动手拆解众筹明星产品安全智能锁KeyWe后,发现它不安全且无解
  11. 【转】简明 Python 教程
  12. cas导入Eclipse中
  13. 问题五十九:怎么求一元六次方程在区间内的所有不相等的实根(1)
  14. EF Code First学习笔记 初识Code First
  15. Julia绘图库GR的下载
  16. VBA dialogs 调用对话框
  17. hadoop 8088端口网页无法打开的原因分析
  18. 美国TOP100大学优势专业位置分布!长篇吐血整理!
  19. 使用Cytoscape 的BinGO插件绘制GO通路关系图
  20. 手机变速齿轮_手机app变速齿轮

热门文章

  1. linux 内存溢出排查_Linux 系统内存泄漏的堆积隐患的排查与解决方法
  2. Spring Boot应用监控实战
  3. 做一个合格的前端,gulp资源大集合
  4. v-html富文本拼接图片地址
  5. 包头昆区多大面积_内蒙古面积最大城市,只因改名被大家嫌弃,总误以为是三线...
  6. 软件测试工作2年薪资没过万,到底差哪了?
  7. windows 10最新版镜像资源下载 Win10 ISO下载教程
  8. 移动端扫描二维码下载app
  9. pandas 中将某一列带有小数的数值转换成百分数
  10. 联想笔记本安装Ubuntu18.04/20.04系统,NVIDIA450/470显卡驱动,CUDA11.*,CUDNN8.*