7

redisstore を使用して水平方向にスケーリングされた複数の socket.io サーバーがあります。私は部屋を効果的にセットアップし、サーバーなどを介して部屋にブロードキャストすることに成功しました.すべてのサーバー。

io.sockets.clients('room') および io.sockets.sockets は、同じ RedisStore に接続されているすべてのサーバーではなく、その 1 つのサーバーに接続されているクライアントの数のみを示します。

提案?

ありがとう。

4

4 に答える 4

3

ユーザーがチャットルームに接続すると、RedisStore のユーザー カウンターをアトミックにインクリメントできます。ユーザーが切断すると、値が減少します。このようにして、Redis はユーザー数を維持し、すべてのサーバーにアクセスできます。

INCRDECRを参照

SET userCount = "0"

ユーザーが接続すると:

INCR userCount

ユーザーが切断すると:

DECR userCount
于 2012-08-28T17:58:09.623 に答える
1

これを解決するには、各サーバーが定期的に redis にユーザー数を設定し、独自の pid を含む有効期限を設定します。

毎回setex userCount:<pid> <interval+10> <count>

その後、ステータス サーバーはこれらのキーのそれぞれについてクエリを実行し、各キーの値を取得できます。

for each keys userCount*do total+=get <key>

したがって、サーバーがクラッシュまたはシャットダウンした場合、そのカウントは interval+10 後に redis から削除されます

醜い疑似コードについて申し訳ありません。:)

于 2012-09-04T15:58:44.053 に答える
0

ハッシュ キーを使用して値を格納できます。

ユーザーがサーバー 1 に接続すると、「userCounts」というキーに「srv1」というフィールドを設定できます。現在のカウントがHSETを使用しているものに値をオーバーライドするだけです。増減する必要はありません。socket.io が認識している現在の値を設定するだけです。

HSET userCounts srv1 "5"

別のユーザーが別のサーバーに接続すると、別のフィールドが設定されます。

HSET userCounts srv2 "10"

次に、どのサーバーでも、「userCounts」からすべてのフィールドを返し、 HVALSを使用してそれらを合計して値リストを返すことにより、合計を取得できます。

HVALS userCounts

サーバーがクラッシュした場合、クラッシュに応答して、そのサーバーのフィールドを userCounts から削除するか、HSET を「0」に設定するスクリプトを実行する必要があります。

Foreverを参照して、サーバーの再起動を自動化できます。

于 2012-08-28T21:28:49.043 に答える