Nodeconf 2012 에서 Shaw 가 발표한 socket.io-announce모듈은 socket.io를 사용한 multi node 에게 message 를 동시에 전송할 수 있는 모듈입니다. 기존 socket.io 를 사용하면 하나의 socket.io 서버에 접속하여 메세지를 교환했는데, 그것의 단점을 보완하여 포트별로 띄워진 socket.io 서버에 socket.io-client가 각각 붙어서 분산효과를 낼 수 있다는 것입니다.
단, 상호 메세지 교환은 안됩니다. 말그대로 annouce!!
단 1가지의 dispatch channel만 이용하기 때문입니다.
scale-out 관련 내용은 boilerplate를 내놓도록 하겠습니다. :)멀티노드로 내가 원하는 메세지를 전송하고, 분산된 멀티노드의 웹소켓서버에 접속하여 이벤트를 교환!!
npm install socket.io-announce
dispatch 라는 이벤트채널로 메세지를 전송합니다.socket.io 로 구성된 node 에서는
socket.io의 store 옵션을 default인 memoryStore에서 redisStore로 설정합니다.
var sio = require('socket.io');
var RedisStore = sio.RedisStore;
// 설정
io.configure(function () {
io.set('store', new RedisStore({ nodeId: function () { return id} }));
});
아래 설명은 socket.io에서 확인하는것과 다를바 없습니다.
socket.io-announce 모듈은 socket.io의 manager.js 라이브러리에서 send 에 필요한 부분만 재작성했기 때문입니다.
var announce = require('socket.io-announce').createClient();
announce.emit('status', { msg:'Going down for maintaince in 15 minutes', countdown: 15*60*1000 });
announce.send('Hello, world!');
announce.emit('quote', { symbol:'APPL', price: 5000 });
announce.in('boardroom').send('Yoyo yo!');`
announce.in('nodeup').emit('tweet', {
id: '130749992326533122',
user:'@dshaw',
text: 'Keeping things small and tightly focused actually makes solving big problems easier.'
});
interface: lo (127.0.0.0/255.0.0.0)filter: (ip) and ( port 6379 )
#
T 127.0.0.1:36467 -> 127.0.0.1:6379 [AP]
*3.
$7.
publish.
$8.
dispatch.
$145.
{"nodeId":240169994,"args":["","5:::{"name":"quote","args":[{"id":1144532298,"symbol":"EXIT","price":"8.74","n":2}]}",null,[]]}.
#
T 127.0.0.1:6379 -> 127.0.0.1:36478 [AP]
*3.
$7.
message.
$8.
dispatch.
$145.
{"nodeId":240169994,"args":["","5:::{"name":"quote","args":[{"id":1144532298,"symbol":"EXIT","price":"8.74","n":2}]}",null,[]]}.
##
T 127.0.0.1:6379 -> 127.0.0.1:36475 [AP]
*3.
$7.
message.
$8.
dispatch.
$145.
{"nodeId":240169994,"args":["","5:::{"name":"quote","args":[{"id":1144532298,"symbol":"EXIT","price":"8.74","n":2}]}",null,[]]}.
##
T 127.0.0.1:6379 -> 127.0.0.1:36472 [AP]
*3.
$7.
message.
$8.
dispatch.
$145.
{"nodeId":240169994,"args":["","5:::{"name":"quote","args":[{"id":1144532298,"symbol":"EXIT","price":"8.74","n":2}]}",null,[]]}.
이곳에 stock 을 아이디어로 예제를 만들어 놓았네요.

$ node exec.js
announce pid: 16733
io nodeId: 1 port: 8881 pid: 16734
io nodeId: 2 port: 8882 pid: 16736
io nodeId: 3 port: 8883 pid: 16738
io nodeId: 4 port: 8884 pid: 16739
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
listening on : { address: '0.0.0.0', family: 'IPv4', port: 8881 }
listening on : { address: '0.0.0.0', family: 'IPv4', port: 8882 }
listening on : { address: '0.0.0.0', family: 'IPv4', port: 8884 }
listening on : { address: '0.0.0.0', family: 'IPv4', port: 8883 }
4개의 프로세를 확인할 수 있습니다. 4개의 포트에 브라우져로 접속하여 확인하면 됩니다.
멀티노드로 내가 원하는 메세지를 전송하고, 분산된 멀티노드의 웹소켓서버에 접속하여 이벤트를 교환!! 아이디어는 여러분의 것입니다. KIN 플~