1

特定の URL から情報をダウンロードし、ビジネス クラスに解析するコンポーネントを構築しています。

これは 2 段階で行われる必要があります。ダウンロード中のページには、第 2 段階でダウンロードされる一連のさらなるページへの URL が含まれています。

私はこれらすべてを可能な限り並列にしたいと考えており、TPL Dataflow フレームワークを使用して全体的な複雑さを軽減しようとしています。

これは私の(簡略化された)セットアップです:

ここに画像の説明を入力

  • URL をダウンロード ブロックに移動するバッファー ブロックに投稿します。
  • ダウンロード ブロックでは、HTML がダウンロードされます。
  • ダウンロード ブロックには両方の解析ブロックへの条件付きリンクがあるため、ページ タイプ A の html はTransformManyBlockである「解析ページ A」に移動されます。
  • ページ A を解析すると、タイプ B のページへの一連の URL が生成されます。
  • それらは再度ダウンロード ブロックに投稿されます。
  • 最後に、条件付きリンクはページ タイプ B の HTML を最後のブロックにポストします。

MaxDegreeOfParallelization を設定して、この方法でサーバーへの最大接続数を制限したいので、ダウンロード ブロックを再利用しています。

単純に 2 つの個別のダウンロード ブロックを使用できれば、セットアップははるかに簡単になりますが、この方法で接続数を制限することはできず、可能な限り多くの並列接続を維持できません。

今、このセットアップに関する私の問題:

Completion を正しく伝達するにはどうすればよいですか? すべての URL の投稿が完了したら、Buffer Block でComplete()を呼び出します。しかし、バッファ ブロックがすべての URL をポストした後でも、「Parse Page A」ブロックから生成された URL にはまだ必要になる可能性があるため、これをダウンロード ブロックに直接伝達することはできません。

しかし、ダウンロード ブロックの完了を Buffer Block と Parse Page A Block Completion の両方に結合します。これは、Parse Page A が完了しないためです。

また、バッファ ブロックが完了したときに "Parse Page A" の Complete() を呼び出すことも考えましたが、ダウンロード ブロックにデータが残っている可能性があり、"Parse Block A" によって拒否されます。

この循環的なジレンマから抜け出す方法はありますか?

または、私は完全に間違った方向に進んでおり、他の方法でそれを行う必要がありますか?

4

1 に答える 1