Ако искате да изпращате съобщения от една машина на друга и не се интересувате от обратни повиквания, тогава 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));
};
Ако искате да изпращате различни видове съобщения, можете да използвате pmessages вместо съобщения:
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, ако имате нужда от комуникация „изпратете и забравите“, проучете други решения, ако имате нужда от пълноценна двупосочна комуникация .