簡體   English   中英

@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 個發布/訂閱客戶端:

  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 package 引起的。redis@4 未正確重新連接發布/訂閱頻道(當前為 v4.0.4)。 將 redis 降級到 v3.1.2 完全解決了重新連接問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM