@socket.io/redis-adapter 和 redis;子客户端在错误后不重新连接

@socket.io/redis-adapter and redis; sub client doesn't reconnect after error

鉴于我正在导入这些包:

import {Socket, Server} from 'socket.io'; // @4.4.1
import {createClient} from 'redis'; // @4.0.4
import {createAdapter} from '@socket.io/redis-adapter'; // @7.1.0
import {Server as HttpServer} from 'http'; // npm@8.5.5, node@v17.7.0

我有一个我创建的服务器:

  const http = HttpServer // from 'http', creation not in this code
  const io = new Server(http, {
    path: '/socket/v1/tunnel',
    serveClient: false,
    cookie: false,
    pingTimeout: 295000,
    pingInterval: 300000,
  });

和 Redis pub/sub 我创建的客户端:

  const pubClient = createClient({
    url: redisAddress,
  });
  const subClient = pubClient.duplicate();

获得这些后,我连接 Redis 客户端并将它们添加到适配器(在 io 中),其中包含以下内容:

  Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
    io.adapter(createAdapter(pubClient, subClient));
...
  }

有了上面的内容,我就有了一个可以工作的套接字服务器。我的问题是每隔约 1 小时我与 Redis 客户端的连接就会出错。 pubClient 会立即重新连接(正如我期望的那样,按照文档),但 subClient 会出错并且不会重新连接。

我可以从其他系统发送到 Redis 中的房间,并且当此子客户端已连接时,消息会传递到适当的设备。在 subClient 第一次出错后(它在大约 1 小时的间隔内相当可预测)它不会重新连接,这意味着发送到 Redis 房间不再路由到它们的目的地。

我有几个问题:

  1. 为什么Redis 客户端不重连? pubClient 在出现错误后始终会重新连接,但 subClient 不会。根据 Redis 文档,它应该会自动重新连接,为什么不呢?
  2. 如何配置子客户端在出错后重新连接?我应该在 subClient.on('error', () => {...} 的处理程序中添加一个 subClient.connect(),还是我配置不正确并且应该使用 createClient({...}) 创建一个新的不同客户端?

这个问题是由redis包引起的。 redis@4 未正确重新连接 pub/sub 个通道(当前为 v4.0.4)。将 redis 降级到 v3.1.2 完全解决了重新连接问题