9

私はAcaniのチャット サーバーを書いています。ロード バランサーのスケーラビリティを備えたnode.jsとwebsockets のスケーリングについていくつか質問があります。

  1. Node.js の負荷分散とは正確には何を意味するのでしょうか? これは、サーバー アプリケーションのn 個の独立したバージョンが実行され、それぞれが別のサーバーで実行されるということですか?

  2. webSocketConnections1 つのクライアントが他のすべてのクライアントにメッセージをブロードキャストできるようにするために、サーバー上で開かれたすべてのクライアントのセットを保存します。しかし、サーバー アプリケーションのn 個の独立したバージョンがそれぞれ別のサーバーで実行されている場合、 n 個の異なるセットを持つことになりwebSocketConnectionsますか?

  3. webSocketConnections1 と 2 の答えが肯定の場合、 (すべてのサーバーにわたって)のユニバーサル セットを保存するにはどうすればよいですか? 私がこれを行うことができると思う 1 つの方法は、Redis Pub/Sub を使用webSocketConnectionし、Redis のチャネルにすべてのサブスクライブを設定することです。

  4. では、単一の Redis サーバーがボトルネックになるのではないでしょうか? 次に、どのように Redis をスケーリングしますか? Redis をスケーリングすることは何を意味するのでしょうか? これは、異なるサーバーで実行されているm 個の独立したバージョンの Redisがあるということですか? それは可能ですか?

  5. Redis はスケーリングしないと聞きました。なぜ誰かがそう言うのでしょうか。どういう意味ですか?それが本当なら、パブ/サブおよび/またはブロードキャストされたすべてのメッセージのリストを保存するためのより良い解決策はありますか?

注: 地球上の 70 億人 (および成長中) のそれぞれが、地球上のすべての人に毎秒メッセージをブロードキャストしたとしても、Acani は規模を拡大する必要がないというのがあなたの答えである場合、有効な説明をしてください。

4

2 に答える 2

6

さて、あなたの質問に対するいくつかの答え:

  1. Node.js の負荷を分散するには、それが何であるかについて考えたこととまったく同じことを意味しますが、実際には別のサーバーが必要ないことを除いて、同じマシンでノード サーバーの複数のプロセスを実行できます。

  2. ノードサーバーの各サーバー/プロセスには独自の接続があり、Websocket (Socket.IO など) のデフォルトストアは MemoryStore です。これは、すべての接続がマシンのメモリに保存されることを意味し、RedisStore と連携する必要があります。 redis を接続ストアとして使用するため。

  3. Redis PUB/SUB は、このタスクを達成するための良い方法です

  4. あなたがここで言ったことは正しいです。現時点では、redis はスケーリングされず、redis に接続された多くのプロセス/接続を実行すると、redis がボトルネックになる可能性があります。

  5. Redis はスケーリングしません。それは正しいですが、このプレゼンテーションによると、redis ではクラスター開発が最優先事項であり、redis にはクラスターがあり、まだ安定していないことがわかります: ( http://redis. io/ダウンロード)

Redis クラスターはどこにありますか?

Redis の開発は現在、Lua スクリプトのサポートやその他の多くの改善をもたらす Redis 2.6 に焦点を当てています。これは現在の優先事項ですが、不安定なブランチには Redis クラスターの基本的な部分のほとんどが既に含まれています。2.6 のリリース後、現在の Redis Cluster アルファ版を、ユーザーが本格的にテストを開始できるベータ版製品にすることに力を注ぎます。Redis Cluster を安定版としてリリースするのは、それが堅実でお客様にとって有用であると判断した場合に限られるため、予測を立てるのは困難ですが、2012 年夏に合理的なベータ版を用意し、最初の安定版リリースをそれまでに出荷したいと考えています。 2012年末。

ここでプレゼンテーションを参照してください: http://redis.io/presentation/Redis_Cluster.pdf

于 2012-10-22T14:46:12.663 に答える
2

2) Redis を使用して接続を保存できない場合があります。Redis はデータを文字列形式で保存できますが、接続オブジェクトに循環参照 (つまり、Engine.IO) がある場合、それらをシリアル化することはできません。

3) クライアントごとに新しい Redis クライアントを作成するのは良い方法ではないかもしれないので、できればそのトラップを避けてください。

ZMQ ノード ライブラリを使用して、プロセスが TCP (マスター ワーカーのようにクラスター化されている場合は IPC) を介して相互に通信することを検討してください。

于 2014-01-29T12:26:49.007 に答える