6

(Amazon SQSを使用して)ジョブキューがあり、HTTPを介してさまざまなドキュメントをフェッチして処理するために多くのマシンにジョブを渡します。アクセスされるホストは数百あり、ジョブの順序は予測できません。

礼儀正しくするために、私は自分のシステムが単一のホストで繰り返しハンマーを打つことを望まない。したがって、example.comから何かをフェッチするためにジョブ#123を取得したが、過去X秒間にexample.comから別のものをフェッチしたことがわかった場合は、別の何かに移動してジョブ#123を保存する必要があります。後で。

問題は、このパターンを実装するための良い方法は何ですか?

最初のステップは、ジョブランナーにすべてのドメインのリストを保持させ、そのドメインの何かに最後にアクセスしたときのようです。これは単純なDBテーブルである可能性があると思います。

その場合、メッセージプロセッサが延期する必要のあるジョブを取得した場合の対処方法には多くの可能なオプションがあります。

  1. メッセージのコピーをキューの最後にプッシュし、実行せずに破棄するだけです。うまくいけば、次にそれが来るときまでに、十分な時間が経過するでしょう。これにより、特に同じドメインのジョブの大規模なクラスターが一度に通過する場合に、冗長なSQSメッセージが多数発生する可能性があります。

  2. ただし、礼儀正しさがジョブの実行を指示するまで、何秒もスリープする必要があります。これにより、多くのキュープロセッサが同時に何もしない可能性があります。

  3. ジョブを受け入れますが、各キュープロセッサのどこかにあるローカルキューに保存します。各プロセッサがこの方法で多数のジョブを「要求」し、最大の礼儀正しさを実現する順序でそれらを処理することを選択できると思います。各キュープロセッサは、他のすべてのドメインがヒットしたドメインを認識する必要があるため、これは依然として予測できない可能性があります。

  4. ドメインごとに個別のキューを確立し、各キュー専用の1つのプロセスを用意します。各プロセスは、各ジョブを実行する間にX秒間一時停止する必要があるため、スリープ状態のプロセスのオーバーヘッドが多くなりますが、これはそれほど悪いことではないかもしれません。

このようなものをデザインした経験はありますか?どのような戦略をお勧めしますか?

4

2 に答える 2

2

ドメインごとに個別のキューとドメインのキュー。

各プロセッサは次のことを行う必要があります。

  1. ドメインのキューからドメインを選択します。
  2. ドメインが最近更新されていない場合は、ドメイン キューから一番上のタスクを選択します。
  3. ドメインをドメイン キューの最後に戻します。
  4. 実行するタスクがある場合は、実行します。
  5. ドメイン キューの先頭を確認するまで、またはドメイン キューが更新されるまでスリープします。

ドメインのキューを時間優先キューとして整理すると、次の更新時間の順序でドメインを保存すると役立つ場合があります。

于 2011-01-02T06:06:07.203 に答える
0

ドメインごとにキューを設定し、キューごとに1つのプロセッサを設定することをお勧めします。

ほとんどのサーバーは、転送の合計量を監視している限り、常に連続して発行される要求に問題はありません(たとえば、実際に必要な場合を除いて、数百KBを超えるファイルのインデックス作成は避けてください)。 。

あなたもrobots.txtのルールに従っていると思います。

于 2011-01-02T05:07:18.963 に答える