如何在许多节点js服务器之间发出消息

时间:2018-09-05 08:23:21

标签: 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', port: 6379 }));
io.emit('hi', 'all sockets');    

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

1 个答案:

答案 0 :(得分:0)

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

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

  • 消息由生产者发送
  • 消息传递给消费者
  • 消息通过频道

enter image description here

有许多关于广告厌恶的消息传递模式。 RabbitMQ上下文中的两个值得注意的消息传递模式是竞争消费者和远程过程调用。

使用具有竞争性消费者消息传递模式的Rabbit MQ

为说明起见,请考虑需要导入大量数据的用户。处理此数据是一项占用大量CPU的任务。一个幼稚的实现可能是:

  • 用户上传数据(请求)
  • 服务器处理数据
  • 回复用户结果(回复)

如果尝试使用Node.js进程直接处理此数据,则将阻止事件循环。在数据处理期间出现的任何请求都必须等待,这不好。系统无响应。更好的方法是:

  • 用户上传数据(请求)
  • 服务器将消息发送到队列
  • 将向用户发送一条响应,并显示一条消息,表明已成功接收到数据并将进行处理(回复)。

已发送到队列的消息包含所有必需的信息(用户信息,文件位置等),并将由可用的使用者(工作人员)提取和处理。处理完数据后,将通知用户。这种一劳永逸的方法具有以下优点:

  • 服务器能够立即处理其他请求
  • 如果当时没有可用资源,则处理会延迟
  • 如果处理第一次失败,将重试

在上面的示例中,我们应用了竞争的消费者模式。当队列中有消息时,任何使用者都可能收到该消息。简而言之,消费者彼此竞争成为消息接收者。 enter image description here