Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 带pm2cluster的Socket.io_Node.js_Socket.io_Pm2 - Fatal编程技术网

Node.js 带pm2cluster的Socket.io

Node.js 带pm2cluster的Socket.io,node.js,socket.io,pm2,Node.js,Socket.io,Pm2,我有一个node.js和socket.io的现有应用程序。但现在我想用pm2集群模块,而不是永远。但是我在socket.io和集群实例方面遇到了一些困难,因为在一些地方消息丢失了。所以我在网上读了一些关于使用另一个名为socket.io-with-pm2-cluster的模块的文章。它充当一个插件。但在使用它时,它要求我以一种方式进行配置,即每个实例必须侦听不同的端口。与应用程序在端口3000上运行类似,实例0,1,23必须使用3001300303304。有人能建议这是否是正确的方法吗?或者任何

我有一个node.js和socket.io的现有应用程序。但现在我想用pm2集群模块,而不是永远。但是我在socket.io和集群实例方面遇到了一些困难,因为在一些地方消息丢失了。所以我在网上读了一些关于使用另一个名为socket.io-with-pm2-cluster的模块的文章。它充当一个插件。但在使用它时,它要求我以一种方式进行配置,即每个实例必须侦听不同的端口。与应用程序在端口3000上运行类似,实例0,1,23必须使用3001300303304。有人能建议这是否是正确的方法吗?或者任何其他解决方法来实现这一点?

我建议使用
socket.io redis
实现此目的,这是socket.io的方法。因此,如果您将来扩展到多台计算机,这将像预期的那样正常工作,但在当前的方法中,它可能无法在多台计算机上工作,如AWS,在这种情况下,您也可以使用LB的粘性会话,但这是一个错误

socket.io需要保持套接字打开,以便将事件从服务器返回到客户机(反之亦然),并且您正在运行多个工作进程,因此“消息丢失的地方很少”

粘性负载平衡

如果您计划在不同的服务器之间分配连接负载 进程或机器,您必须确保与 使用特定会话id连接到发起的进程 他们

您需要引入使服务无状态的层,您可以使用

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

在节点之间传递事件

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

负责路由消息的接口就是我们称之为适配器的接口。您可以在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的发布/订阅机制广播到每个节点


您可以阅读更多详细信息

您是否尝试将模式设置为websocket?