2

それで、Socket.IO のスケーリングに関する記事をいくつか読みました。さまざまな理由から、組み込みの Socket.IO スケーリング メカニズムを使用したくありません (私の観点からは必要以上に多くのものを Redis に発行するため、ほとんどの場合、効率が悪いようです)。

だから私はこの単純なアイデアを思いついた:

各 Socket.IO サーバーは Redis pub/sub/store クライアントを作成し、Redis に接続してチャンネルをサブスクライブします。今、データをブロードキャストしたいときは、Redis に公開するだけで、他のすべての Socket.IO サーバーがそれを取得してユーザーにプッシュします。

ただし、問題があります (これは Socket.IO 組み込みメカニズムの問題でもあると思います)。接続しているすべてのユーザーの数を知りたいとしましょう。これを行うには、少なくとも 2 つの方法があります。

  1. サーバー Agive_me_clientsは Redis に発行します。次に、各 Socket.IO サーバーが接続をカウントし、公開しnumber_of_clientsます。サーバー A はこのデータを取得して結合し、クライアントに送信します。

  2. number_of_clients_for::ID_HEREユーザーがサーバーに接続/切断するたびに、Redis で各サーバーが更新されます。次に、サーバー A はデータを取得して結合します。より効率的かもしれません。

ただし、これらのソリューションには問題があります。

  1. サーバー A は他のサーバーを認識していません。したがって、彼はいつ聞くのをやめるべきかわかりませんnumber_of_clients。サーバー A に他のサーバーを認識させることで修正できます: サーバーが Redis に接続するたびに、サーバーnew_serverA はデータを取得してメモリに保存します。しかし、Redis - Socket.IO 接続が切断された場合はどうすればよいでしょうか? クライアントの 1 つが切断されたことを Redis がクライアントに通知する方法はありますか?

  2. 実は上と同じ。Socket.IO サーバーがクラッシュした場合、number_of_clientsデータをクリアする方法は?

したがって、本当の問題は次のとおりです: Redis はクライアントの 1 つとの接続が終了したことをクライアントに通知 (シャネルに公開) できますか??

4

1 に答える 1

2

多くのテストを行った結果、Redisにはそのような機能がないようです。また、Socket.IOのスケーリングは本当に苦痛であることがわかりました。

そこで、Socket.IOからWSに切り替えました(このリンクを参照)。これは低レベルであり(ただし、私の使用には最適です)、WebSocketのみをサポートします(すべてのメジャーバージョンで)。しかし、ここでも、WebSocketとFlashSocketのみをサポートしたいと思います(手動で実装する必要がありますが、それで問題ありません)。

利点は、そのようなサーバーでクラスターを簡単に作成できることです。HAProxyは、ほとんど箱から出してそのようなサーバーで動作します(いくつかのマイナーな調整)。サーバーはローカルネット上で簡単に通信できます(クラスターが大きい場合はUDPまたは中央TCPサーバーを使用)。

欠点は、ハートビート、ブロードキャスト、部屋などのいくつかのクールな機能を手動で実装する必要があることです。また、長いポーリングのフォールバックが必要ですが、私の場合は問題ありません。スケーリングはさらに重要です、imho。

于 2012-06-22T09:02:50.197 に答える