通过[Node] 的 websocket 和 redis pub/sub,将通知发送给客户端
我希望通过服务器将消息发送给客户端
最初我在node端创建了一个websocket服务器,与客户端进行双向通信。但我希望能通过其他服务器或批处理的更新操作来触发向客户端(使用的传统频道)发送消息。
所以我进行了一些研究,发现了redis的发布/订阅功能,我决定尝试使用它,看看是否能成功。
实施的想法
使用的模块
redis pub/sub
他のサーバでの変更を検知するために使用
socket.io-emitter
サーバ側からclientにメッセージを送るためのモジュール
socket.io-redis
異なるプロセスやサーバ間で動いているwebsocketサービスで接続先情報をredisで共有し、正常にemitやbroadcastを行えるようにするためのモジュール
安装
$ 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的订阅者,将其作为触发器,在io emitter中向客户端发出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发布者,向”SUBSCRIBE_CHANNEL”发送消息即可通知所有在前端打开了”CLIENT_CHANNEL”的人员:”Hello!! I am redis-subscriber.”
最后
使用Redis的pub/sub和socket.io-emitter,我们能够在与其他服务器同步的同时,将通知以良好的方式发送到前端。
我已经将示例放在这里,如果方便的话,请参考。
如果有错误,请告诉我,我会很高兴的。