Se vuoi inviare messaggi da una macchina all'altra e non ti interessano le richiamate, Redis pub/sub è la soluzione migliore. È davvero facile da implementare e Redis è davvero veloce.
Per prima cosa devi installare Redis su una delle tue macchine.
È davvero facile connettersi a Redis:
var client = require('redis').createClient(redis_port, redis_host);
Ma non dimenticare di aprire la porta Redis nel tuo firewall!
Quindi devi iscrivere ogni macchina a qualche canale:
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
});
Puoi saltare your_namespace
e usa lo spazio dei nomi globale, ma prima o poi te ne pentirai.
È davvero facile anche inviare messaggi:
var send_message = function(machine_name, message) {
return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};
Se vuoi inviare diversi tipi di messaggi, puoi usare pmessages invece dei messaggi:
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));
};
La migliore pratica è nominare i tuoi processi (o macchine) in base alla loro funzionalità (ad es. 'send_email'
). In tal caso il processo (o la macchina) può essere iscritto a più di un canale se implementa più di una funzionalità.
In realtà, è possibile costruire una comunicazione bidirezionale utilizzando redis. Ma è più complicato poiché richiederebbe l'aggiunta di un nome univoco del canale di richiamata a ciascun messaggio per ricevere la richiamata senza perdere il contesto.
Quindi, la mia conclusione è questa:Usa Redis se hai bisogno di una comunicazione "invia e dimentica", studia altre soluzioni se hai bisogno di una comunicazione bidirezionale a tutti gli effetti .