首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是最有效的node.js进程间通信库/方法?

什么是最有效的node.js进程间通信库/方法?
EN

Stack Overflow用户
提问于 2011-06-24 05:51:07
回答 6查看 55.6K关注 0票数 77

我们几乎没有能够传递消息的node.js进程,最有效的方法是什么?使用node_redis pub/sub怎么样

编辑:进程可能在不同的机器上运行

EN

回答 6

Stack Overflow用户

发布于 2012-09-16 15:51:06

如果您想从一台机器发送消息到另一台机器,而不关心回调,那么Redis pub/sub是最好的解决方案。它很容易实现,Redis非常快。

首先,你必须在你的一台机器上安装Redis。

很容易连接到Redis:

代码语言:javascript
复制
var client = require('redis').createClient(redis_port, redis_host);

但是不要忘记在防火墙中打开Redis端口!

然后,您必须订阅每台机器到某个频道:

代码语言:javascript
复制
client.on('ready', function() {
  return client.subscribe('your_namespace:machine_name');
});

client.on('message', function(channel, json_message) {
  var message;
  message = JSON.parse(message);
  // do whatever you vant with the message
});

您可以跳过your_namespace并使用全局命名空间,但迟早会后悔的。

发送信息也很容易:

代码语言:javascript
复制
var send_message = function(machine_name, message) {
  return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};

如果您想发送不同类型的消息,可以使用pmessage而不是消息:

代码语言:javascript
复制
client.on('ready', function() {
  return client.psubscribe('your_namespace:machine_name:*');
});

client.on('pmessage', function(pattern, channel, json_message) {
  // pattern === 'your_namespace:machine_name:*'
  // channel === 'your_namespace:machine_name:'+message_type
  var message = JSON.parse(message);
  var message_type = channel.split(':')[2];
  // do whatever you want with the message and message_type
});

send_message = function(machine_name, message_type, message) {
  return client.publish([
    'your_namespace',
    machine_name,
    message_type
  ].join(':'), JSON.stringify(message));
};

最佳实践是根据流程(或机器)的功能(如'send_email')命名您的流程(或机器)。在这种情况下,如果进程(或机器)实现了一个以上的功能,它可以订阅多个信道。

实际上,使用redis建立双向通信是可能的。但是这更棘手,因为它需要在每条消息中添加唯一的回调通道名,以便在不丢失上下文的情况下接收回调。

因此,我的结论是:如果您需要“发送和忘记”通信,使用Redis,如果您需要完整的双向通信,则研究另一种解决方案。

票数 54
EN

Stack Overflow用户

发布于 2012-09-17 17:16:52

为什么不使用ZeroMQ/0mq作为工控机?Redis (数据库)对于做像IPC这样简单的事情来说太过分了。

引用指南:

MQ (ZeroMQ,0MQ,zmq)看起来像一个可嵌入的网络库,但它的作用就像一个并发框架。它为您提供了在进程内、进程间、TCP和多播等各种传输中携带原子消息的套接字。您可以将套接字N与诸如扇出、pub-sub、任务分发和请求-应答等模式连接起来。它的速度足以成为集群产品的面料。它的异步I/O模型为您提供了可伸缩的多核应用程序,这些应用程序构建为异步消息处理任务。

使用0MQ (甚至是通过Node中的网络库使用普通套接字,减去0MQ套接字提供的所有功能)的优点是没有主进程。它的无代理设置最适合您描述的场景。如果您只是从一个中心进程向各个节点发送消息,则可以在0mq中使用PUB/ socket (还可以通过PGM/EPGM支持IP多播)。除此之外,0mq还提供了各种不同的套接字类型(PUSH/PULL/XREP/XREQ/路由器/交易商),您可以用它们创建自定义设备。

从这个很好的指南开始:http://zguide.zeromq.org/page:all

对于0MQ 2.x:

http://github.com/JustinTulloss/zeromq.node

对于0MQ3.x(上述模块的分叉)。这支持PUBSUB的发布端过滤):

http://github.com/shripadk/zeromq.node

票数 40
EN

Stack Overflow用户

发布于 2015-11-26 21:45:47

问题提出四年多后,出现了一个名为节点-ipc的进程间通信模块。它支持在同一台机器上进行通信的unix/windows套接字,以及TCP、TLS和UDP,声称至少套接字、TCP和UDP是稳定的。

下面是从github存储库中获取的文档中的一个小示例:

用于Unix、Windows和TCP的服务器

代码语言:javascript
复制
var ipc=require('node-ipc');

ipc.config.id   = 'world';
ipc.config.retry= 1500;

ipc.serve(
    function(){
        ipc.server.on(
            'message',
            function(data,socket){
                ipc.log('got a message : '.debug, data);
                ipc.server.emit(
                    socket,
                    'message',
                    data+' world!'
                );
            }
        );
    }
);

ipc.server.start();

Unix的客户端& TCP套接字

代码语言:javascript
复制
var ipc=require('node-ipc');

ipc.config.id   = 'hello';
ipc.config.retry= 1500;

ipc.connectTo(
    'world',
    function(){
        ipc.of.world.on(
            'connect',
            function(){
                ipc.log('## connected to world ##'.rainbow, ipc.config.delay);
                ipc.of.world.emit(
                    'message',
                    'hello'
                )
            }
        );
        ipc.of.world.on(
            'disconnect',
            function(){
                ipc.log('disconnected from world'.notice);
            }
        );
        ipc.of.world.on(
            'message',
            function(data){
                ipc.log('got a message from world : '.debug, data);
            }
        );
    }
);

我目前正在评估这个模块来替换本地ipc (但将来可能是远程ipc ),作为通过stdin/stdout替换旧解决方案的方法。也许我会扩展我的答案,当我做了一些更多的信息,如何和如何好这个模块的工作。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6463945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档