连接一段时间后出现 Redis ETIMEDOUT 错误



概述

在两个单独的 Azure 实例上,在第一个节点上.js服务器正在运行,它们连接到在第二个实例上运行的单节点 Redis 服务器,并且节点.js 正在尝试与 redis 保持活动连接。Node Redis 模块用于在 Redis 中存储和检索数据,socket.io 发射器模块用于允许不同的服务器根据客户端的集合连接发送消息。

问题

在一段时间(零星)后完成初始连接后,连接冻结并最终崩溃,并从所有服务器抛出ETIMEDOUT错误。

我试过什么。

i. 先添加socket_keepalive,然后再添加socket_initialdelay

const redis = require('redis');
let options = {socket_keepalive : true, socket_initialdelay : 200000};
global.client = redis.createClient(port, host, options);

ii. 使用socket.io-emitter模块尝试使用节点 redis 模块本身使用新的 redis 对象初始化它,但之后通知停止工作,因此撤回到同一内容。

这将停止对设备的单独通知

let options = {socket_keepalive : true, socket_initialdelay : 200000};
let redis_socket = require('redis');
let pub = redis_socket.createClient(port, host, options);
let ioz = require('socket.io-emitter')(pub);

*显然,工作方法存在超时问题。

iii. 在 Redis 的服务器上,超时配置设置为 0,tcpdelay 为 300 秒,但我们尝试将其更改为 0(tcpdelay),但问题仍然存在。

它肯定会让我头疼,因为同一段代码在另一个环境中工作,但导致这种情况的原因仍然是一个谜,在调查了更多之后,我意识到连接的客户端(可通过 monitor 命令使用)在一段时间后掉线,因此抛出了 etimedout 错误。

相同的 redis 机器也用于缓存,它可以正常工作。

看起来您可能遇到了 4 分钟的 TCP 空闲超时。

根据 Redis 3.2 的自我记录配置,tcp-keepalive的值必须不为零才能工作。因此,您可能希望设置一个值,例如 120 (240/2),然后重试。

最新更新