Hvis du vil sende beskeder fra en maskine til en anden og er ligeglad med tilbagekald, så er Redis pub/sub den bedste løsning. Det er virkelig nemt at implementere, og Redis er virkelig hurtigt.
Først skal du installere Redis på en af dine maskiner.
Det er virkelig nemt at oprette forbindelse til Redis:
var client = require('redis').createClient(redis_port, redis_host);
Men glem ikke at åbne Redis-porten i din firewall!
Så skal du abonnere på hver maskine på en eller anden kanal:
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
});
Du kan springe your_namespace
over og brug globalt navneområde, men du vil fortryde det før eller siden.
Det er også rigtig nemt at sende beskeder:
var send_message = function(machine_name, message) {
return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};
Hvis du vil sende forskellige slags beskeder, kan du bruge p-beskeder i stedet for beskeder:
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));
};
Den bedste praksis er at navngive dine processer (eller maskiner) efter deres funktionalitet (f.eks. 'send_email'
). I så fald kan processen (eller maskinen) abonnere på mere end én kanal, hvis den implementerer mere end én funktionalitet.
Faktisk er det muligt at bygge en tovejskommunikation ved hjælp af redis. Men det er mere vanskeligt, da det ville kræve at tilføje et unikt tilbagekaldskanalnavn til hver besked for at modtage tilbagekald uden at miste kontekst.
Så min konklusion er denne:Brug Redis, hvis du har brug for "send og glem"-kommunikation, undersøg en anden løsning, hvis du har brug for fuldgyldig tovejskommunikation .