[Node] websocket + redis pub/sub로 서버에서 클라이언트에 알림 보내기
서버에서 클라이언트에게 메시지를 보내고 싶었습니다.
원래 node로 만든 websocket server로 client측과 쌍방향 통신을 하고 있었습니다만, 다른 서버나 batch 처리등에서의 갱신 처리를 트리거로서 client(의 종래에서 사용하고 있는 channel)에 메세지를 보내고 싶다 되었습니다.
거기서 여러가지 찾고 있으면, redis에 pub/sub 기능이라고 하는 것이 있어, 그것을 사용하면 능숙해질 것 같기 때문에 해 보았습니다.
구현 이미지
사용한 모듈
사용한 모듈
redis pub/sub
socket.io-emitter
socket.io-redis
설치
$ npm i -S redis
$ npm i -S socket.io
$ npm i -S socket.io-emitter
$ npm i -S socket.io-redis
구현
우선, 종래의 socket 서비스의 접속처를 공유하기 위해서, socket.io-redis를 넣는다.
// socket-server
const io = require('socket.io')(); // for socket server
const socketRedis = require('socket.io-redis');
// 接続先情報をredisに保存
io.adapter(socketRedis({
host: 'localhost', //サンプルなので一旦ローカルのredisを参照
port: 6379,
}));
// 〜〜〜従来のsocket処理〜〜〜
그런 다음 서버에서 메시지를 보내기 위해 io-emitter를 넣습니다.
// 先ほどと同じredis情報を渡して起動することで、接続情報を共有
const emitter = ioEmitter({
host: 'localhost',
port: 6379,
});
마지막으로 redis subscriber를 만들고 트리거로 io emitter로 client에 emit합니다.
const redis = require('redis');
// subscribeする用のredis clientを作成
// ここではめんどくさかったので、接続情報を登録するものと同じものを使用
const Subscriber = redis.createClient(6379, 'localhost');
// redis-publisherからのメッセージを受け取るチャンネルを登録
Subscriber.subscribe('SUBSCRIBE_CHANNEL');
exports.register = (emitter) => {
Subscriber.on('message', (channel, message) => {
switch (channel) {
// 該当のチャンネルにメッセージが飛ばされたら場合分けして処理
case 'SUBSCRIBE_CHANNEL':
emitter.to('CLIENT_CHANNEL').emit('Hello!! I am redis-subscriber.');
break;
}
});
};
이제 다른 서버에서 redis publisher를 사용하여 "SUBSCRIBE_CHANNEL"에 메시지를 보내면 전면에서 "CLIENT_CHANNEL"을 열고있는 모든 사람에게 "Hello!! I am redis-subscriber."라는 메시지를 알립니다. 할 수 있다.
마지막으로
redis pub/sub와 socket.io-emitter를 사용하면 다른 서버와 동기화하면서 좋은 느낌으로 프런트에 알림을 보낼 수 있습니다.
샘플은 여기 에 두어 두었으므로 좋으면 참조하십시오.
실수 등이 있으면 가르쳐 주면 기쁩니다.
Reference
이 문제에 관하여([Node] websocket + redis pub/sub로 서버에서 클라이언트에 알림 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ykmikan821/items/36515f2baca941108485
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ npm i -S redis
$ npm i -S socket.io
$ npm i -S socket.io-emitter
$ npm i -S socket.io-redis
우선, 종래의 socket 서비스의 접속처를 공유하기 위해서, socket.io-redis를 넣는다.
// socket-server
const io = require('socket.io')(); // for socket server
const socketRedis = require('socket.io-redis');
// 接続先情報をredisに保存
io.adapter(socketRedis({
host: 'localhost', //サンプルなので一旦ローカルのredisを参照
port: 6379,
}));
// 〜〜〜従来のsocket処理〜〜〜
그런 다음 서버에서 메시지를 보내기 위해 io-emitter를 넣습니다.
// 先ほどと同じredis情報を渡して起動することで、接続情報を共有
const emitter = ioEmitter({
host: 'localhost',
port: 6379,
});
마지막으로 redis subscriber를 만들고 트리거로 io emitter로 client에 emit합니다.
const redis = require('redis');
// subscribeする用のredis clientを作成
// ここではめんどくさかったので、接続情報を登録するものと同じものを使用
const Subscriber = redis.createClient(6379, 'localhost');
// redis-publisherからのメッセージを受け取るチャンネルを登録
Subscriber.subscribe('SUBSCRIBE_CHANNEL');
exports.register = (emitter) => {
Subscriber.on('message', (channel, message) => {
switch (channel) {
// 該当のチャンネルにメッセージが飛ばされたら場合分けして処理
case 'SUBSCRIBE_CHANNEL':
emitter.to('CLIENT_CHANNEL').emit('Hello!! I am redis-subscriber.');
break;
}
});
};
이제 다른 서버에서 redis publisher를 사용하여 "SUBSCRIBE_CHANNEL"에 메시지를 보내면 전면에서 "CLIENT_CHANNEL"을 열고있는 모든 사람에게 "Hello!! I am redis-subscriber."라는 메시지를 알립니다. 할 수 있다.
마지막으로
redis pub/sub와 socket.io-emitter를 사용하면 다른 서버와 동기화하면서 좋은 느낌으로 프런트에 알림을 보낼 수 있습니다.
샘플은 여기 에 두어 두었으므로 좋으면 참조하십시오.
실수 등이 있으면 가르쳐 주면 기쁩니다.
Reference
이 문제에 관하여([Node] websocket + redis pub/sub로 서버에서 클라이언트에 알림 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ykmikan821/items/36515f2baca941108485
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Node] websocket + redis pub/sub로 서버에서 클라이언트에 알림 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ykmikan821/items/36515f2baca941108485텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)