pub/subでプロセス同士におしゃべりさせる。

今日のブログはお遊びです。

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の使い方は掴めました。

コメント

タイトルとURLをコピーしました