Nếu bạn muốn gửi tin nhắn từ máy này sang máy khác và không quan tâm đến các cuộc gọi lại thì Redis pub / sub là giải pháp tốt nhất. Nó thực sự dễ thực hiện và Redis thực sự nhanh chóng.
Trước tiên, bạn phải cài đặt Redis trên một trong các máy của mình.
Nó thực sự dễ dàng kết nối với Redis:
var client = require('redis').createClient(redis_port, redis_host);
Nhưng đừng quên mở cổng Redis trong tường lửa của bạn!
Sau đó, bạn phải đăng ký từng máy với một số kênh:
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
});
Bạn có thể bỏ qua your_namespace
và sử dụng không gian tên chung, nhưng bạn sẽ sớm hối tiếc.
Gửi tin nhắn cũng rất dễ dàng:
var send_message = function(machine_name, message) {
return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};
Nếu bạn muốn gửi các loại tin nhắn khác nhau, bạn có thể sử dụng pmessages thay cho tin nhắn:
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));
};
Cách tốt nhất là đặt tên cho các quy trình (hoặc máy) của bạn theo chức năng của chúng (ví dụ:'send_email'
). Trong trường hợp đó, quá trình (hoặc máy) có thể được đăng ký vào nhiều kênh nếu nó triển khai nhiều chức năng.
Trên thực tế, có thể xây dựng giao tiếp hai chiều bằng redis. Nhưng phức tạp hơn vì nó sẽ yêu cầu thêm tên kênh gọi lại duy nhất vào mỗi tin nhắn để nhận lệnh gọi lại mà không làm mất ngữ cảnh.
Vì vậy, kết luận của tôi là: Sử dụng Redis nếu bạn cần giao tiếp "gửi và quên", điều tra các giải pháp khác nếu bạn cần giao tiếp hai chiều chính thức .