Se você deseja enviar mensagens de uma máquina para outra e não se importa com retornos de chamada, o Redis pub/sub é a melhor solução. É muito fácil de implementar e o Redis é muito rápido.
Primeiro você precisa instalar o Redis em uma de suas máquinas.
É muito fácil se conectar ao Redis:
var client = require('redis').createClient(redis_port, redis_host);
Mas não se esqueça de abrir a porta Redis em seu firewall!
Então você tem que inscrever cada máquina em algum canal:
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
});
Você pode pular
your_namespace
e use namespace global, mas você vai se arrepender mais cedo ou mais tarde. Também é muito fácil enviar mensagens:
var send_message = function(machine_name, message) {
return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};
Se você deseja enviar diferentes tipos de mensagens, pode usar pmessages em vez de mensagens:
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));
};
A melhor prática é nomear seus processos (ou máquinas) por sua funcionalidade (por exemplo,
'send_email'
). Nesse caso, o processo (ou máquina) pode ser inscrito em mais de um canal se implementar mais de uma funcionalidade. Na verdade, é possível construir uma comunicação bidirecional usando redis. Mas é mais complicado, pois seria necessário adicionar um nome de canal de retorno de chamada exclusivo a cada mensagem para receber o retorno de chamada sem perder o contexto.
Então, minha conclusão é esta:Use o Redis se você precisar de comunicação "enviar e esquecer", investigue outras soluções se você precisar de comunicação bidirecional completa .