私はNIOを初めて使用し、JettyがNIOをどのように活用しているかを理解しようとしています。
ブロッキングIOを使用する従来のサーブレットコンテナがリクエストを処理する方法についての私の理解は次のとおりです:
doGet
など)が呼び出されますInputStream
とOutputStream
が渡されますInputStream
から読み取り、OutputStream
に書き込みますInputStream
とOutputStream
は、基本的に、基になるSocket
のそれぞれのストリームに関連付けられています。NIOコネクタを使用した場合の違いは何ですか?私の推測は次の線に沿っています:
InputStream
でラップしますOutputStream
でラップされます)doGet
など)を呼び出して、上記のラッパーストリームを処理しますSocketChannel
に書き込みます。Jettyのドキュメントから、次のことがわかりました:
SelectChannelConnector -このコネクタは、非ブロッキングスレッドモデルで効率的なNIOバッファを使用します。 JettyはDirectNIOバッファーを使用し、リクエストのある接続にのみスレッドを割り当てます。同期はサーブレットAPIのブロッキングをシミュレートし、リクエスト処理の最後にフラッシュされていないコンテンツは非同期に書き込まれます。
Synchronization simulates blocking for the servlet API
の意味がわかりませんか?
あなたはそれを正確に持っていません。 jettyがNIOコネクタを使用する場合(および9はNIOのみをサポートします)、次のように機能します。
セレクターがIOアクティビティを検出すると、接続でハンドルメソッドを呼び出します。
スレッドがディスパッチされると、接続の読み取りと解析が試行されます。現在何が起こるかは、接続がhttp、spdy、http2、またはwebsocketのいずれであるかによって異なります。
スレッドがサーブレットにディスパッチされると、サーブレットIOがブロックしているように見えますが、HttpInputStreamおよびHttpOutputStreamのレベルの下では、すべてのIOはコールバックと非同期です。ブロッキングAPIは、特別なブロッキングコールバックを使用してブロッキングを実現します。これは、サーブレットが非同期IOの使用を選択した場合、ブロッキングコールバックをバイパスし、非同期APIを多かれ少なかれ直接使用していることを意味します。
このビューは、多重化されたhttp2とspdyによって少し複雑になるため、追加のディスパッチが必要になる可能性があります。
ディスパッチしないHTTPフレームワークは、ベンチマークコードでは非常に高速に実行できますが、データベース、ファイルシステム、RESTサービスなどのブロックなどの愚かなことを実行できる実際のアプリケーションに直面すると、不足します。ディスパッチの意味は、1つの接続がシステム上の他のすべての接続を保持できることを意味します。
Jettyが非同期とディスパッチを処理する方法の詳細については、以下を参照してください。