オブジェクトの永続性のために、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());
})