2012-01-08 19 views
9

複雑な要件が多数のユーザー(&サーバー)に設定されている場合、特にブロードキャストでwebsocketインフラストラクチャ(サーバー)の規模がどのように拡大しますか?Websocketのスケーラビリティ、ブロードキャストに関する懸念

もちろん、ブロードキャストはwebsocket仕様の一部ではありませんが、基本的なチャットの例(a.k.a. hello world for websocket)でもあります。

クライアントサイド(新しいデータを求める)ソリューションは、ウェブソケットの待ち時間が少なく、比較的安価な(httpヘッダーレス)性質を持つサーバー側(ブロードキャスト)ソリューションよりもスケーラビリティが高いようです。

編集:

OKは、ちょうどあなたが非常に多くの異なるコンテキスト内でそのように多くの接続を意味する可能性があるのWebSocketの実装で、すべてのAjaxコードを交換したいと思います。これは、ブロードキャストのためのすべての可能なシナリオを把握したい場合、システムに非常に複雑なものを追加します。

低レベル(ネットワーク/スレッドなど)レベルの実装提案も問題ではありません。これは、一般的なhttpサーバーとは異なり、特別なサーバーをコーディングする必要があるためです。

さらに、ブロードキャストは、簡単に拡張できないステートフルな性質をテーブルにもたらします。サーバーの追加と負荷分散について考えてみましょう。

答えて

15

リアルタイムWebソリューションをスケーリングすることは複雑な問題ではなくPusherのようなサービスは、(私がのために働く者)解決している、とself hosted realtime web solutionsのために定義されたソリューションは、ほとんど間違いなくあることを一つずつすることができます - PubSub paradigmはよく理解されており、多くを解決してきましたこの問題を解決するには、何らかの国家(誰が何に加入しているか)が必要です。このパラダイムは、あなたが話しているシナリオの種類を放送する際に使用されます。地面からの多く -

Broadcasting diagram

リアルタイムWeb技術は心の同時接続を大量に構築されています。スケーラブルなソリューションを作成する場合は、WebSocketをサポートする既存のリアルタイムWebサーバーを使用する可能性が高くなります。独自のHTTPサーバーを実装することはほとんどありませんが、独自のサーバーを実装することはほとんどありませんWebSocketを最初からサポートしています。

専用のリアルタイムWebサーバーを使用すると、アプリケーションのロジックをリアルタイムの通信メカニズム(懸念の分離)から分離することもできます。アプリケーションは何らかの状態を維持する必要があるかもしれませんが、リアルタイムテクノロジーはサブスクリプションと接続の管理を扱います。アプリケーションとリアルタイムWebテクノロジーとの間のコミュニケーションはあなた次第ですが、頻繁にメッセージキューが使用され、具体的にはredisがこの領域で非常に人気があります。

HTTPポーリングは概念的に理解しやすいかもしれません。ステートレスを維持し、各HTTPポーリング要求で正確に何を探しているかを指定できます。しかし、これは、間違いなくスケーリングをはるかに早く開始する必要があることを意味します(負荷を処理するためにリソースを追加する)。

WebSocketポーリングは私が以前考えていなかったものですが、私はそれが以前にもどこかで提案されているとは思わなかったのです。クライアントが「私の次のデータセットの準備が整っていて、私が欲しいものは何か」という発想は興味深いものです。 WebSocketは、一般的に要求/応答のパラダイムから飛躍しましたが、WebSocketの効率向上と要求/応答の利点があるシナリオがあります。アプリケーション・フレームワークのSocketStreamは、関連性があるので一見価値があります。最初のアプリケーションの負荷の後、すべての通信がWebSocketを介して実行されます。つまり、イベントの基本要求/応答機能がWebSocketを使用します。

SocketStream logo

我々は放送データについて話しているので、しかし、我々は戻って、それがアクティブなサブスクリプションを持ってはるかに理にかなっていると、新しいデータが新しいデータがそれらに分布していることが利用可能になったときPubSubのパラダイムへ行く必要がありますアクティブなサブスクリプション(プッシュ)。データを公開するかどうかを決定するために、アクティブなサブスクリプションがあるかどうかをアプリケーションが知る必要があります。その問題は解決されました。

1

ウェブソケットのアイデアは、各クライアントとの永続的な接続を維持することです。すべてのクライアントに送信する新しいデータがある場合は、すべてのクライアントが誰であるかをすでに知っているので、送信するだけです。

各クライアントが常に新しいデータの要求をサーバーに送信するように思えます。どうして?それはみんなの帯域幅を浪費するように思えます。なぜそれがよりスケーラブルになると思いますかわかりません。たぶん、どのような種類の情報をブロードキャストしているか、どのくらいの頻度で何バイト、何人のクライアントなどの詳細情報を質問に追加できますか?

オープンWebSocket接続は、より多くのデータのクライアント?

+2

IMHOは、 "すべてのクライアントが誰であるかを知る"ということは、サーバ側のWebソケット開発においてそれほど簡単ではありません。あなたはコンテキスト内のすべての人を効率的に追跡しなければなりません。また、複数のサーバーを持つことでより複雑になります。 新しいサーバーを簡単に追加できるように、サーバー実装がクライアントについて知る必要がないため、新しいデータを要求するIMOはスケーラビリティに優れています。また、HTTPヘッダーレスWebSocketを使用すると、帯域幅を小さくしておくことができます。 –

+1

あなたが何をしていても、サーバはオープンソケットのリストを保持しなければならないので、クライアントについて知っている必要があります。オープンソケットのリストがないと、そこから入ってくるデータを聞くことができません(例えば、 'select'や' epoll'関数に渡すファイル記述子のリストはわかりません)。私は思っている送受信データ用のバッファを追跡する必要もあります。オープンなTCP/IP接続を忘れることはできません。とにかくそのリストを追跡しているので、必要に応じて、自分の識別データのいくつかをそのリストに追加するのはあまり難しいことではありません。 –

+0

あなたはほぼセッションとソケットのコンセプトを混ぜています。最初はアプリケーションレベル、後者はネットワークレベルです。実際には、あなたはそれを深くしたいとは考えていません。 IMHO、アプリケーションレベルでこの問題を考える方が良いです。 –

関連する問題