sql >> データベース >  >> NoSQL >> Redis

nodeJSでのPub/subの実装

    オブジェクトの永続性のために、node_redisを使用してRedissupportを追加しました。次に、チャネルの配列のclient.sendループを、抽象化レイヤーとしてRedis pub/subasに置き換えました。しかし、サブスクリプションを作成したユーザーごとにnewRedisクライアントを作成する必要があることに気づきました。また、公開時にメッセージを送信するために、socket.ioクライアント情報を保存する必要がありました。それはどれくらいスケーラブルですか?私が行うことができる他の(より良い)実装またはさらなる最適化はありますか?どうしますか?

    はい、ioリクエストごとに新しいredisクライアントを作成する必要があります。それは重く、スケーラブルではありません。ただし、新しいredisクライアント接続を作成しても、多くのメモリを消費することはありません。したがって、システムユーザー数が5000以下であれば、問題ありません。スケーリングするには、スレーブRedisサーバーを追加して、大量のパブリッシュとサブスクライブを解決できます。また、多数の接続の作成が心配な場合は、OSuLIMITを増やすことができます。

    送信されるメッセージにsocket.ioクライアントを保存する必要はありません。 redisがサブスクライブされたチャネルメッセージを受信したら。特定のioクライアントにメッセージを送信します。

    subscribe.on("message",function(channel,message) { 
     var msg = { message: [client.sessionId, message] }; 
     buffer.push(msg);
     if (buffer.length 15) buffer.shift(); 
     client.send(msg); > });
    

    マルチチャネルをサブスクライブします。すべてのユーザーを複数のチャネルで事前に保存することをお勧めします(ストレージMongodbまたはredisを使用できます)。

    var store = redis.createClient();
    var subscriber= redis.createClient()
    
    store.hgetall(UID, function(e, obj){
         subscriber.subscribe(obj.ChannelArray.toArray());
     })
    


    1. Node.js WebSocket Redisサーバーをスケーリングする方法は?

    2. SpringSecurityとMongoDBによる認証

    3. bluebirdを使用してnodejsですべてのプロミスが終了するのを待ちます

    4. SQLデータベースの代わりに/Redisなどのキー/値ストアを使用する場合