redisstore を使用して水平方向にスケーリングされた複数の socket.io サーバーがあります。私は部屋を効果的にセットアップし、サーバーなどを介して部屋にブロードキャストすることに成功しました.すべてのサーバー。
io.sockets.clients('room') および io.sockets.sockets は、同じ RedisStore に接続されているすべてのサーバーではなく、その 1 つのサーバーに接続されているクライアントの数のみを示します。
提案?
ありがとう。
redisstore を使用して水平方向にスケーリングされた複数の socket.io サーバーがあります。私は部屋を効果的にセットアップし、サーバーなどを介して部屋にブロードキャストすることに成功しました.すべてのサーバー。
io.sockets.clients('room') および io.sockets.sockets は、同じ RedisStore に接続されているすべてのサーバーではなく、その 1 つのサーバーに接続されているクライアントの数のみを示します。
提案?
ありがとう。
これを解決するには、各サーバーが定期的に redis にユーザー数を設定し、独自の pid を含む有効期限を設定します。
毎回setex userCount:<pid> <interval+10> <count>
その後、ステータス サーバーはこれらのキーのそれぞれについてクエリを実行し、各キーの値を取得できます。
for each keys userCount*do total+=get <key>
したがって、サーバーがクラッシュまたはシャットダウンした場合、そのカウントは interval+10 後に redis から削除されます
醜い疑似コードについて申し訳ありません。:)
ハッシュ キーを使用して値を格納できます。
ユーザーがサーバー 1 に接続すると、「userCounts」というキーに「srv1」というフィールドを設定できます。現在のカウントがHSETを使用しているものに値をオーバーライドするだけです。増減する必要はありません。socket.io が認識している現在の値を設定するだけです。
HSET userCounts srv1 "5"
別のユーザーが別のサーバーに接続すると、別のフィールドが設定されます。
HSET userCounts srv2 "10"
次に、どのサーバーでも、「userCounts」からすべてのフィールドを返し、 HVALSを使用してそれらを合計して値リストを返すことにより、合計を取得できます。
HVALS userCounts
サーバーがクラッシュした場合、クラッシュに応答して、そのサーバーのフィールドを userCounts から削除するか、HSET を「0」に設定するスクリプトを実行する必要があります。
Foreverを参照して、サーバーの再起動を自動化できます。