2017-02-05 8 views
0

JettyのHTTP2は、ほとんどがConnector、Transport、Channelレベルであることを理解しています。JettyにHTTP2サーブレットを実装する最良の方法は何ですか?

私は、クライアントとサーバー間のバイナリデータを転送するために最善をされるであろう組み合わせ決定しようとしている:

  1. 桟橋HTTP2サーバ同期サーブレットとの非同期サーブレット+桟橋HTTP2クライアントと
  2. 桟橋HTTP2サーバ+桟橋HTTP2クライアント
  3. 非同期サーブレット+ネッティーHTTP2クライアントと
  4. 桟橋HTTP2サーバ
  5. GRPCクライアントとサーバ(両方ともデフォルトネッティー基づいています)

詳細:

私は私のクライアントにバイナリデータを送信したいと私は、接続が非ブロック/非同期になりたいです。同時のクライアント要求の数は高くなる可能性があり、サーバーはいくつかの要求に応答するのに数秒(時には)かかることがあります。

各応答は小さなバイナリデータのチャンクです。 byte[]またはByteBufferにコピーする代わりにNettyのByteBufsを直接応答として送信できるのであれば、私はそれを気に入っていましたが、それはこの特定の質問に直接関係していません。

メソッド#4は、ProtoBuf wrapping (link)limitation (link)のために私のお気に入りではありません。

桟橋参照:

答えて

3

免責事項、私は突堤HTTP/2メンテナいます。

クライアント数が多く、処理に数秒かかる場合は、オプション1 - asyncサーブレットとJetty HTTP/2クライアントを使用することをお勧めします。

「非同期サーブレット」では、1)ブロッキングI/Oによる非同期処理、または2)非同期処理+非同期I/Oという2つの味があります。

サーブレット非同期処理は、HttpServletRequest.startAsync()を使用してトリガーされます。

サーブレットの非同期入出力は、ReadListenerWriteListenerをそれぞれServletInputStreamServletOutputStreamに設定してトリガーされます。

クライアントの数が多く、数秒単位で処理するため、非同期処理が必要なのは間違いありません。これにより、サーバースレッドの使用が最適化されます。

バイナリ応答が小さいため、非同期I/Oを使用するかどうかは、おそらく測定する必要があります。 I/Oのブロックはコードとデバッグがはるかに簡単ですが、非同期I/Oはコードとデバッグの方がはるかに複雑です。非同期I/Oは、TCP接続を輻輳させる可能性のある大量のコンテンツと低速のクライアントを持つ場合には本当に輝きます。

完全非同期にする場合は、非同期I/Oを使用します。よりシンプルなコードの交換で少しのブロッキングを許容できるのであれば、I/Oをブロックしておいてください。 非同期入出力またはブロック入出力のどちらの場合でも、非同期処理を使用することを繰り返します。あなたは桟橋のクラスに投げて喜んでいる場合

データをコピーする問題については、あなたが直接ByteBufferからServletOutputStreamサブクラスを書くことによってコピーを避けることができ、this exampleを参照してください。

最後に、Jettyクライアントでは、詳細hereとしてHTTP/2トランスポートを使用して、ハイレベルのHttpClientを使用することができます。この利点は、HTTP/2フレーム、ストリームなどを扱う低レベルのHTTP2Clientを使用するのではなく、HTTPの概念のみを扱う高レベルのAPIになります。

あなたが最終的に選択したものを報告し、それがあなたのためにどうなるかを報告してください!

関連する問題