我们几乎没有能够传递消息的node.js进程,最有效的方法是什么?使用node_redis pub/sub怎么样
编辑:进程可能在不同的机器上运行
发布于 2012-09-16 15:51:06
如果您想从一台机器发送消息到另一台机器,而不关心回调,那么Redis pub/sub是最好的解决方案。它很容易实现,Redis非常快。
首先,你必须在你的一台机器上安装Redis。
很容易连接到Redis:
var client = require('redis').createClient(redis_port, redis_host);但是不要忘记在防火墙中打开Redis端口!
然后,您必须订阅每台机器到某个频道:
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并使用全局命名空间,但迟早会后悔的。
发送信息也很容易:
var send_message = function(machine_name, message) {
return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};如果您想发送不同类型的消息,可以使用pmessage而不是消息:
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,如果您需要完整的双向通信,则研究另一种解决方案。
发布于 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
发布于 2015-11-26 21:45:47
问题提出四年多后,出现了一个名为节点-ipc的进程间通信模块。它支持在同一台机器上进行通信的unix/windows套接字,以及TCP、TLS和UDP,声称至少套接字、TCP和UDP是稳定的。
下面是从github存储库中获取的文档中的一个小示例:
用于Unix、Windows和TCP的服务器
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套接字
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替换旧解决方案的方法。也许我会扩展我的答案,当我做了一些更多的信息,如何和如何好这个模块的工作。
https://stackoverflow.com/questions/6463945
复制相似问题