私はさまざまなサーバーのスキャンを実行するサービスを持っています。問題のネットワークは膨大な数(数十万のネットワークノード)になる可能性があります。TPLキューの管理
私たちによって設計されたキューイング/スレッディングアーキテクチャを使用していますが、効率的ではありません(ジョブがうまく処理されない子を生成できるため)
V2が登場し、TPLの使用を検討しています。それは理想的に適しているようです。
私はthis questionを見ました。その答えは、TPLが処理できるタスクに制限がないことを意味します。私の簡単なテスト(10万のタスクをスピンアップしてTPLに渡す)では、TPLはOut-of-Memory例外をかなり早い段階で回避しました。
スキャンはさまざまな時間がかかりますが、5分/タスクは良い平均です。
巨大なネットワークのスキャンでは、貧弱なサーバーであっても、かなりの時間がかかります。
複数のスキャンサーバー間でスキャンジョブ(複数のDbに格納されている)を分割できるフレームワークが既に用意されていますが、特定のサーバーのTPLに作業をどのくらい正確に渡すべきかという疑問があります。
TPLのキューのサイズを監視して、数百エントリ未満になると(たとえば)上回ることはできますか?これには欠点がありますか?
また、スキャンを一時停止する必要がある状況も処理する必要があります。これは、すでに部分的に処理されている可能性があるタスクをキャンセル/リセットするよりも、TPLに作業を与えない方が簡単だと思われます。
すべての初期タスクは、任意の順序で実行できます。親は実行を開始した後に子を実行する必要がありますが、親がそれらを生成するため、これは問題になることはありません。子供は、任意の順序で実行することができます。このため、私は現在、子タスクを直接TPLに生まれていないDbに書き戻すことを想定しています。これにより、必要に応じて他のサーバーを「盗む」ことができます。
誰もこのようにTPLを使用した経験はありますか?私が気づく必要がある考慮すべき点はありますか?
何千分もかかる「タスク」のスケジュールは、それぞれ数分かかる場合があります。そのような場合、TPLはあなたのケースではおそらく良い考えではない、新しい「タスク」の繰り返しを予定しています。 – svick
特定のスキャン(約5分間実行されているタスク)が、ネットワークから戻ってくるものを待っているI/Oや、CPUを分析しているほとんどの時間を費やしているかどうかはわかりません。 これに適したフレームワークは、TPL DataFlowとReactive Extensions 2.0です。 与えられたスキャンがどのようなものであるかを示すコードを与えることができれば、他の人がより良い方向を与えるのに役立つかもしれません。 –
@JamesManningお詫び申し上げます、私はそれをもっと明確にしておかなければなりません... 5分の99%がネットワークIOで待機しています – Basic