0

私のアプリケーションでは、ドキュメントをフェッチするたびに何千ものリーダーを持つことができます。

ディスクと CPU を最大限に使用できるように、低速のリーダーをバッファリングして他のリーダーを処理できるようにする必要があります。

これは通常どのように行われますか?もちろん、TCP 送信バッファを使用することもできますが、これらはすぐにいっぱいになると思います。

別の戦略は、バインドされる ChannelBuffers の単なるキューである別のバッファーを保持することです。

これらのバッファーのいずれかがいっぱいになった場合、そのクライアントは十分に高速に読み取れないため、そのクライアントを失敗させる必要があると思いますか?

4

2 に答える 2

1

TCP 送信バッファを使用しています。それが最初に満たされるものです。次に、長さゼロの書き込みを開始します。その時点で、次の 2 つのことを行う必要があります。

  1. その接続の出力の生成を停止します。
  2. OP_WRITE のチャネルを登録し、起動したら最後の書き込みを再試行します。成功した場合は、OP_WRITE の登録を解除し、通常どおり続行します。

私の意見では、状態 2 にある間は、そのチャネルからの読み取りも停止する必要があります。まだ要求を生成していて、応答を消費していない場合、それは問題であり、あなたの問題ではありません。読み取っていない応答を生成し続ける理由はありません。また、応答を読み取るように設計するまでそれらを保持してメモリを浪費する理由もありません。

于 2013-05-12T02:46:01.673 に答える
0

ディスクと CPU を最大限に使用できるように、低速のリーダーをバッファリングして他のリーダーを処理できるようにする必要があります。

Netty は本当にあなたのためにこれを処理します。シングルスレッドであるため、クライアントが何かを読み取るのを待つことはできません。そうしないと、シングルスレッドがロックされて何も起こりません。したがって、 ChannelBuffer に書き込むだけでブロックされず、 netty に戻した後、後で送信されます。したがって、他のバッファーがクライアントに送信されているか送信されていないときに、スレッドを解放して別のクライアントにサービスを提供します。したがって、リーダーが遅い場合は、 ChannelBuffer がいっぱいになってしまいますが、読み取られていません。

何かがクライアントによって本当に読み取られない場合は、ChannelBuffer (または多く) がスペースを占有しているだけですが、これを使用して、何かに時間がかかりすぎてクリーンアップした場合に通知を受け取ることができます。

http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/timeout/ReadTimeoutHandler.html

これもあります:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/timeout/IdleStateHandler.html

于 2013-05-12T02:49:37.360 に答える