0

私の質問がばかげている場合は申し訳ありません。

ArrayBlockingQueue を使用しています。

private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;

ここで、私の Producer は別のスレッドで、 Consumer は別の Thread です。どちらもシングル プロデューサー - コンシューマー スレッド モデルで実行されています。

現在、サーブレットにリクエストを送信する Java アプリを実行しています。プロデューサーはリクエストをキューに入れました。コンシューマーはリクエストを取得し、DB 操作を含む処理を開始します (タスクの完了には約 1 秒かかります)。

ここで、My Producer は非常に高速にリクエストを取得し、Queue をいっぱいにして、Consumer が処理を開始し、Queue にスペースを作るまで待ちます。

ここでの私の質問は

  1. 最高のパフォーマンスを得るには、どの BlockingQueue Impl を使用する必要がありますか。
  2. Queue Size が Full の場合に何が起こるかというと、Producer が Queue が Vaccant になるのを待っているかどうかに関係なく、Servlet がリクエストを受け取ることを意味します。これらのすべての受信リクエストはどうですか? それらの要求はどこに行きますか?それらのリクエストはJVMメモリに保存され、ノンブロッキングになったらプロデューサースレッドに渡されますか?

ありがとう。

4

3 に答える 3

2

適切なソリューションは、アプリケーション要件の実現可能性によって異なりますが、以下が役立つ場合があります。

Q が満杯の場合は、無期限にブロックするのではなく、でブロックしtimeoutて、修正構成された時間内にサーブレットが応答を返すようにします。の場合timeout、サーブレットはサーバー ビジーの種類のカスタム エラー メッセージまたは関連するHTTP-CODE.

コンシューマは遅く、プロデューサは非常に高速であるため、コンシューマ スレッドを増やして、サーブレット呼び出し元のブロッキング エクスペリエンスを軽減することを検討することもできます。

また、すべてのリクエストを受け入れる (つまり、無制限の Q に格納する) ことは、コンシューマ Q が遅いため (リクエストのサイズによっては) 時間の経過とともに大量のメモリを消費する可能性があるため、良い解決策ではありません..

于 2013-07-18T07:54:03.343 に答える
1

最高のパフォーマンスを得るには、どの BlockingQueue Impl を使用する必要がありますか。

システムにネットワークがあることを考えると、違いがあった場合は驚くでしょうが、FIFO のパフォーマンスが基準であり、ランダム アクセスがない場合は、リンクされたリストに基づいたものを使用することを検討する必要があります。

キュー サイズがいっぱいになるとどうなるか

BlockingQueue,ブロックするように指定しました。

これはすべて Javadoc にあります。

于 2013-07-18T08:47:42.733 に答える
1

1) メソッドなどの戻り値の型のフィールドまたは変数の型として具体的な実装を使用しないでください。代わりに、インターフェイスまたは抽象クラスを使用してください。あなたの場合、そのようなクラスは次のようになりますBlockingQueue

private BlockingQueue<RequestParameters> processorQueue = ...

2) 追加のフィールドは必要ありません。sizeOfQueueその値を のコンストラクターに渡しますprocessorQueue

LinkedBlockingQueue3) 最後に、そのような目的で実装を使用できます。

private BlockingQueue<RequestParameters> processorQueue = new LinkedBlockingQueue(300);

于 2013-07-18T07:55:36.633 に答える