Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 如何在多个js服务器节点之间发送消息_Node.js_Sockets_Redis_Socket.io - Fatal编程技术网

Node.js 如何在多个js服务器节点之间发送消息

Node.js 如何在多个js服务器节点之间发送消息,node.js,sockets,redis,socket.io,Node.js,Sockets,Redis,Socket.io,因为我是新手,需要一些帮助。我需要在多个nodeJS服务器之间发送消息。我需要的通信是服务器到服务器,而不是服务器到浏览器(我发现的大多数模式是什么)。 就我所读的内容而言,我可能需要redis。我已经安装了它,可以接受连接了。 如果我从socket.io尝试此代码 var io = require('socket.io')(3000); var redis = require('socket.io-redis'); io.adapter(redis({ host: 'localhost', p

因为我是新手,需要一些帮助。我需要在多个nodeJS服务器之间发送消息。我需要的通信是服务器到服务器,而不是服务器到浏览器(我发现的大多数模式是什么)。 就我所读的内容而言,我可能需要redis。我已经安装了它,可以接受连接了。 如果我从socket.io尝试此代码

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

。。。什么也没发生。有人建议我缺少什么或者我可以实现的其他模式吗?谢谢

您可以尝试使用RabbitMQ进行消息传递

在构建需要扩展的应用程序时,RabbitMQ是一个非常强大的概念。在构建分布式系统时,有一个将工作生产者与消费者(工作者)分开的工作队列是一种常见的模式

  • 消息由生产者发送
  • 信息被传递给消费者
  • 信息通过一个通道传递

有许多消息传递模式,都是关于ad nauseum的。RabbitMQ上下文中两种值得注意的消息传递模式是竞争消费者和远程过程调用

将Rabbit MQ与竞争消费者的消息传递模式结合使用

以说明,考虑需要导入大量数据的用户。处理这些数据是一项CPU密集型任务。一个简单的实现可以是:

  • 用户上传数据(请求)
  • 服务器处理数据
  • 用结果回复用户(回复)
如果您试图直接使用Node.js进程处理此数据,则会阻塞事件循环。在数据处理过程中出现的任何请求都必须等待,这是不好的。系统没有响应。更好的办法是:

  • 用户上传数据(请求)
  • 服务器向队列发送消息
  • 向用户发送一个响应,其中包含一条消息,说明数据已成功接收并将被处理(回复)
发送到队列的消息包含所有必需的信息(用户信息、文件位置等),并将由可用的使用者(工作者)拾取和处理。处理完数据后,将通知用户。这种方法(开火并忘记)有几个优点:

  • 服务器能够立即处理其他请求
  • 如果此时没有可用资源,则处理会延迟
  • 如果第一次处理失败,将重试处理
在上面的示例中,我们应用了竞争消费者模式。当队列中有消息时,任何使用者都可能收到它。简单地说,消费者相互竞争成为信息接收者。

我认为你可以简单地在你的应用程序中定义一个路由,比如
app.post(“/message”,…)
,然后通过一个常规的HTTP调用从另一个服务器调用它,例如使用
request.post(serverURL+“/message”,{data})
。这是双向的。这是我要做的,作为第一种方法。谢谢,但我需要多个节点/服务器之间的通信。如果服务器A上发生了什么事情,其余连接的服务器(B、C、D等)应该接收A发送的数据。这就是为什么我认为使用redis可以解决我的问题,但不确定如何实现逻辑。