今日のブログはお遊びです。
pub/subでおしゃべり
pub/subを使えば、あまり難しいことを考えなくても、Node.jsのプロセス間で通知を送り合うことができます。
そういうわけで、Node.jsのプロセスを4つ立てて、pub/subでチャットみたいなことをさせてみました。
各プロセスはpublisherでありsubscriberである。
var subscriber = require('redis').createClient(6379, 'localhost');
var publisher = require('redis').createClient(6379, 'localhost');
var userId = Math.floor(Math.random() * 10000);
各プロセスは、発言する際はpublisherであり、それ以外の場合はsubscriberになります。そういうわけで、Redisへのコネクションを2つ確立しておきます。
ユーザーIDを乱数で生成していますが、これは手抜きのためです。
メッセージ送信の実装
プロセスが発言するためには、publishMessage関数を使います。
function publishMessage(message) {
var data = JSON.stringify({
userId : userId,
message : message
});
publisher.publish('chat', data);
}
これは、ユーザーIDとメッセージをJSONにかためて、Redisにpublishするだけです。
入室の実装
チャットなので、入室の処理が必要かなーと思って作りました。
setTimeout(function() {
publishMessage('enter the room...');
}, 1000);
プロセスが起動してから、1秒後に’enter the room…’という発言をするだけです。
他の人の発言に対する反応の実装
1プロセス立ち上げるだけだと、入室して終わるんですが、複数プロセス立ち上げると、おしゃべりを始めます。
subscriber.subscribe('chat');
subscriber.on('message', function(channel, data) {
var data = JSON.parse(data);
var senderUserId = data.userId;
var message = data.message;
console.log(senderUserId + ' : ' + message);
if ((senderUserId != userId && message.indexOf('enter the room...') != -1) || message.indexOf(userId) != -1) {
setTimeout(function() {
publishMessage(randomMessage() + ' > ' + senderUserId);
}, Math.floor(Math.random() * 5000 + 1000));
}
});
途中ひどい手抜きがありますが、要するに「誰かが自分宛に発言をしたら、数秒後に返事を返す」という処理です。他の人の発言は、subscribeしているので即時に受け取ることができます。
発言はランダムメッセージで
function randomMessage() {
var messages = ['hello', 'lol', 'good morning!', 'i am hungry.', 'sleepy...', 'hi!', 'yes', 'hogehoge', 'fugafuga'];
var index = Math.floor(Math.random() * messages.length);
return messages[index];
}
面倒くさいので、発言はランダムでテキトーです。
1プロセスの場合
左上の窓に、入室のメッセージが出ますが、人がいないのでそのまま静まり返った部屋です。
8624 : enter the room...
2プロセスの場合
2人目の参加者の入室を皮切りに会話が始まります。
8624 : enter the room... 6405 : enter the room... 8624 : hi! > 6405 6405 : hello > 8624 8624 : i am hungry. > 6405 6405 : hi! > 8624 8624 : sleepy... > 6405
ご覧のとおり、会話としては全く成立していません。
4プロセスの場合
4プロセスになると会話の組が6通りになるので、ガヤガヤと流れます。
・・・それだけです。テーマとしてはつまらない感じですが、pub/subの使い方は掴めました。
コメント