[Node] websocket + redis pub/sub로 서버에서 클라이언트에 알림 보내기

6597 단어 websocketRedisNode.js

서버에서 클라이언트에게 메시지를 보내고 싶었습니다.



원래 node로 만든 websocket server로 client측과 쌍방향 통신을 하고 있었습니다만, 다른 서버나 batch 처리등에서의 갱신 처리를 트리거로서 client(의 종래에서 사용하고 있는 channel)에 메세지를 보내고 싶다 되었습니다.
거기서 여러가지 찾고 있으면, redis에 pub/sub 기능이라고 하는 것이 있어, 그것을 사용하면 능숙해질 것 같기 때문에 해 보았습니다.

구현 이미지





사용한 모듈



  • redis pub/sub
  • 다른 서버의 변경 사항을 감지하는 데 사용됩니다


  • socket.io-emitter
  • 서버 측에서 클라이언트로 메시지를 보내기위한 모듈


  • 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 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를 사용하면 다른 서버와 동기화하면서 좋은 느낌으로 프런트에 알림을 보낼 수 있습니다.
    샘플은 여기 에 두어 두었으므로 좋으면 참조하십시오.

    실수 등이 있으면 가르쳐 주면 기쁩니다.

    좋은 웹페이지 즐겨찾기