GraniteDS と非同期サーブレット
GraniteDS は、私の知る限り、リアルタイム メッセージング用の非同期サーブレットを実装する唯一のソリューションです。データプッシュ。この機能は、Servlet 3 コンテナ (Tomcat 7、JBoss 7、Jetty 8、GlassFish 3 など) だけでなく、特定の非同期サポートを備えた古いコンテナやその他のコンテナ (Tomcat 6/CometProcessor、WebLogic 9+/AbstractAsyncServlet など) でも利用できます。など)
他のソリューションにはこの機能がない (BlazeDS) か、RTMP を使用する (LCDS、WebORB、Clear Toolkit の最新バージョン)。RTMP の実装についてはあまり言えませんが、BlazeDS は同期サーブレット モデルしか使用していないため、スケーラブルなリアルタイム メッセージングの実装が明らかに不足しています。
何千もの同時ユーザーを処理する必要がある場合は、スケーラビリティと堅牢性をさらに向上させるために、GraniteDS サーバーのクラスターを作成することもできます (たとえば、このビデオを参照してください)。
非同期サーブレットのパフォーマンス
非同期サーブレットと従来のサーブレットのスケーラビリティは、何度かベンチマークされており、印象的な結果が得られています。たとえば、Jetty ブログの次の投稿を参照してください。
非 NIO または非継続ベースのサーバーでは、10,000 人の同時ユーザーを処理するために約 11,000 のスレッドが必要になります。Jetty は、この数の接続をわずか 250 スレッドで処理します。
古典的な同期モデル:
- 10,000 の同時ユーザー -> 11,000 のサーバー スレッド。
- 1.1の比率。
コメット非同期モデル:
- 10,000 の同時ユーザー -> 250 のサーバー スレッド。
- 0.025 の比率。
この種の比率は、他の非同期実装 (Jetty ではない) から大まかに予測できます。また、プレーン テキストの HTTP 要求の代わりに Flex/AMF3 を使用しても、結果が大きく変わることはありません。
非同期サーブレットを使用する理由
各リクエストがすぐに処理される場合は、従来の (同期) サーブレット モデルを使用できます。
request -> immediate processing -> response
データ プッシュの問題は、HTTP プロトコルには真の「データ プッシュ」が存在しないことです。サーバーは、データを送信するためにクライアントへの呼び出しを開始できず、リクエストに応答する必要があります。そのため、Comet の実装は別のモデルに依存しています。
request -> wait for available data -> response
同期サーブレット処理では、各要求は 1 つの専用サーバー スレッドによって処理されます。ただし、データ プッシュ処理のコンテキストでは、このスレッドはほとんどの場合、利用可能なデータを待っているだけで、サーバー リソースを大量に消費しながら何もしません。
非同期処理のすべての目的は、サーブレット コンテナーがこれらの (多くの場合) アイドル状態のスレッドを使用して、他の着信要求を処理できるようにすることです。そのため、アプリケーションでリアルタイム メッセージング機能が必要な場合に、スケーラビリティの面で劇的な改善が期待できます。
このメカニズムを説明している Web 上のリソースは他にもたくさんあります。Comet でググってみてください。