あるマシンから別のマシンにメッセージを送信し、コールバックを気にしない場合は、Redis pub/subが最適なソリューションです。実装は非常に簡単で、Redisは非常に高速です。
まず、マシンの1つに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を使用し、本格的な双方向通信が必要な場合は別のソリューションを調査します 。