Lettuce 实战之连接超时问题

问题

使用lettuce作为redis连接池,在访问redis时,偶尔会抛出RedisCommandTimeoutException,但隔一会儿又好了。

为什么lettuce有自动重连机制,却还是会出现连接超时的问题?为什么lettuce在连接断掉后,没有立即重连,而是需要等待十多分钟才重新连接?

在lettuce client和redis server之间创建TCP连接后,由于网络等原因导致TCP连接中断后,lettuce client等待TCP连接进行重试,直到重试完成后还是无法成功才创建新的连接。重试次数与操作系统配置有关。

根据下述图表,在重试15次时,超时时间约为13.4分钟,这就是为什么lettuce的自动重连,会等待十多分钟才进行重连。

重传机制参考 https://pracucci.com/linux-tcp-rto-min-max-and-tcp-retries2.html

查看TCP重试次数配置

cat /proc/sys/net/ipv4/tcp_retries2

解决方法

  • 一是调低操作系统中TCP重试的次数,例如5次,这样在连接断掉后,等待几秒钟就会立即重联。
  • 二是在获取redis connection时,验证该连接是否可用,不可用则创建一个新的连接返回,配置如下
LettuceConnectionFactory factory = new LettuceConnectionFactory();
factory.setValidateConnection(true);
posted @ 2024-04-30 23:39  cd_along  阅读(99)  评论(0编辑  收藏  举报