それで、Socket.IO のスケーリングに関する記事をいくつか読みました。さまざまな理由から、組み込みの Socket.IO スケーリング メカニズムを使用したくありません (私の観点からは必要以上に多くのものを Redis に発行するため、ほとんどの場合、効率が悪いようです)。
だから私はこの単純なアイデアを思いついた:
各 Socket.IO サーバーは Redis pub/sub/store クライアントを作成し、Redis に接続してチャンネルをサブスクライブします。今、データをブロードキャストしたいときは、Redis に公開するだけで、他のすべての Socket.IO サーバーがそれを取得してユーザーにプッシュします。
ただし、問題があります (これは Socket.IO 組み込みメカニズムの問題でもあると思います)。接続しているすべてのユーザーの数を知りたいとしましょう。これを行うには、少なくとも 2 つの方法があります。
サーバー A
give_me_clients
は Redis に発行します。次に、各 Socket.IO サーバーが接続をカウントし、公開しnumber_of_clients
ます。サーバー A はこのデータを取得して結合し、クライアントに送信します。number_of_clients_for::ID_HERE
ユーザーがサーバーに接続/切断するたびに、Redis で各サーバーが更新されます。次に、サーバー A はデータを取得して結合します。より効率的かもしれません。
ただし、これらのソリューションには問題があります。
サーバー A は他のサーバーを認識していません。したがって、彼はいつ聞くのをやめるべきかわかりません
number_of_clients
。サーバー A に他のサーバーを認識させることで修正できます: サーバーが Redis に接続するたびに、サーバーnew_server
A はデータを取得してメモリに保存します。しかし、Redis - Socket.IO 接続が切断された場合はどうすればよいでしょうか? クライアントの 1 つが切断されたことを Redis がクライアントに通知する方法はありますか?実は上と同じ。Socket.IO サーバーがクラッシュした場合、
number_of_clients
データをクリアする方法は?
したがって、本当の問題は次のとおりです: Redis はクライアントの 1 つとの接続が終了したことをクライアントに通知 (シャネルに公開) できますか??