13

私はかなり複雑な Java サーバー アプリケーションを作成しています。このアプリケーションには、通常の要求応答処理に加えて、重要なバックグラウンド処理部分があります。バックグラウンド処理の一部は、Quartz フレームワークを使用して cron のような方法で実行されます。他のタスクはよりオンデマンドです。新しいクライアントが接続すると、時々更新するための追加のジョブが作成されます。cron タスクもさまざまです。外部アプリケーションの監視を行うものもあれば、統計を計算するものもあります。

同様のジョブはスレッド プールを共有するが、別のジョブはスレッド プールを共有しないという考えで、これらすべてのジョブを実行するために多数のスレッド プールを使用しています。たとえば、モニター ジョブが統計プールで実行されることはなく、統計ジョブがモニター プールで実行されることもありません。

一方で、1 つのスレッド プールだけを持ち、分離せずにすべてをその上で実行することを好む人もいます。

そのようなシナリオでベストプラクティスと見なされるのは何だろうか。

スレッドプールを分離することの長所と短所は何ですか?

それも問題ですか?

4

2 に答える 2

6

答えは、アプリケーションリソースをさまざまな種類のアクティビティ間で分離する必要があるかどうかによって異なります。

たとえば、私は現在、数人の高スループットのライターと潜在的に多くのリーダーで構成されるサーバーアプリケーションを作成しています。読者は散発的にアプリにアクセスしますが、大量のデータを要求する可能性があります(つまり、長時間実行される要求)。ライターが飢えないようにする必要があるので、読み取り/書き込み用に2つのスレッドプールをデザインで使用します。リーダースレッドプールが一時的に使い果たされた場合、ライターは影響を受けません。読み取り要求のみが遅延します。

PriorityQueue別の方法は、をと組み合わせて使用​​し、ThreadPoolExecutor書き込み要求により高い優先順位を割り当てることでした。

結論として、私のアドバイスは次のとおりです。1つのスレッドプールから始めて、具体的な理由がある場合にのみ、設計をより複雑にします。

于 2009-09-17T08:37:11.067 に答える
0

それは直接的な答えではありませんが、別の提案です:-(

Quartz ジョブは一時停止、キャンセルなどを行うことができます。これを「管理対象」と呼びましょう。それらを管理するためのUIを作成すると思います。

他のジョブ (「オンデマンド」) は、もちろん実装しない限り、同じ機能の恩恵を受けないことを認識していますか? 統一されたコードを得るために、すべてを石英の仕事にすることを検討しましたか(たとえそれがすぐに開始されたとしても)?

于 2009-09-17T08:15:59.470 に答える