【问题标题】:Socket.io with pm2cluster带有 pm2cluster 的 Socket.io
【发布时间】:2020-01-03 07:56:33
【问题描述】:

我有一个 node.js 和 socket.io 的现有应用程序。但现在我想用 pm2 集群模块代替永远。但是我在使用 socket.io 和集群实例时遇到了一些困难,因为在少数地方消息丢失了。所以我在网上读了一点,使用另一个名为 socket.io-with-pm2-cluster 的模块。它充当插件。但是在使用它时,它要求我以每个实例必须侦听不同端口的方式进行配置。就像应用程序在端口 3000 上运行一样,实例 0、1、23 将必须使用 3001、3002、3003、3004。谁能建议这是否是正确的方法?或者任何其他解决方法可以使这成为可能?

【问题讨论】:

  • 你试过设置websocket模式吗?

标签: node.js socket.io pm2


【解决方案1】:

我建议为此使用socket.io-redis,这是socket.io 的recommended 方法。因此,如果您将来扩展到多台计算机,这将按预期工作,但在当前方法中,它可能无法在多台计算机上工作,例如 AWS,在这种情况下,您也可以使用 LB 的粘性会话,但这.

socket.io 需要保持套接字打开以将事件从服务器返回到客户端(反之亦然),并且您正在运行多个工作人员,这就是为什么您会得到“消息丢失的地方很少”。

粘性负载平衡

如果您计划在不同的 进程或机器,您必须确保请求关联 使用特定的会话 ID 连接到发起的进程 他们。

你需要引入让你的服务无状态的层,你可以使用socket.io-redis

通过使用 socket.io-redis 适配器运行 socket.io,您可以运行 不同进程或服务器中的多个 socket.io 实例 都可以相互广播和发射事件。

在节点之间传递事件

您希望有多个 Socket.IO 节点接受连接,如果您想向每个人(甚至某个房间中的每个人)广播事件,您将需要某种方式在进程或计算机之间传递消息。

负责路由消息的接口就是我们所说的Adapter。您可以在 socket.io-adapter 之上实现您自己的(通过继承它),或者您可以使用我们在 Redis 之上提供的一个:socket.io-redis

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

然后是下面的调用:

io.emit('hi', 'all sockets');

会通过Redis的Pub/Sub机制广播到每个节点。

您可以阅读更多详细信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 2013-11-24
    • 2018-08-27
    • 2014-03-24
    • 2014-02-28
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多