6

私は、HTTP経由でさまざまなドキュメントを取得して処理するためにジョブを多くのマシンに渡すジョブキュー(Amazon SQSを使用)を持っています。アクセスされる数百の異なるホストがあり、ジョブのための予測可能な順序はありません。自己再配置ジョブキューのメソッド

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

このパターンを実装するにはどうすればよいでしょうか。

ジョブランナーは、すべてのドメインのどこかにリストを保存し、そのドメインの何かにアクセスした最後の時間を持つようにするのが最初の手順です。私はこれが単純なDBテーブルかもしれないと思います。

メッセージプロセッサが延期する必要があるジョブを取得した場合の対処方法は、さまざまな可能性があります。

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

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

  3. ジョブを受け入れますが、各キュープロセッサのどこかのローカルキューに保存します。私は各プロセッサがこのようにしていくつかの仕事を「主張する」ことができると思っています。そして、最大の礼儀を達成する順序でそれらを処理することを選択します。これは、各キュープロセッサが他のキュープロセッサにヒットしたドメインを認識する必要があるため、予測できないことがあります。

  4. ドメインごとに個別のキューを設定し、各キュー専用の1つのプロセスを用意します。各プロセスは各ジョブの実行の間にX秒間休止する必要があるため、プロセスのオーバーヘッドが大きくなりますが、これは悪いことではありません。

このようなことを設計する経験はありますか?どのような戦略をお勧めしますか?

+0

SQSに100%固定ですか?ドメインごとのキューソリューションにあなたを強制するわけではありませんが、SQSが提供していないと確信しているキューを直接制御する必要があります(正確に言うと、基本的には、挿入されずに純粋なキューではなく、二重リンクされたリストとして扱われます)。 – DVK

答えて

0

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

ほとんどのサーバーでは、転送量の合計に注意している限り、常に連続して発行されるリクエストに問題はありません(たとえば、実際のデータを持たない限り、数百KB以上のファイルのインデックスを作成しないでください。それの必要性)。

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

2

各ドメインとドメインのキューにそれぞれ別のキューがあります。

各プロセッサは、必要があります。

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

ドメインのキューを時間優先キューとして編成すると、次の更新時間の順にドメインを格納するのに役立ちます。

+0

十分な数の別個のドメインがあり、ドメインのキューで競合が予想される場合は、プロセッサがドメインを自分の* local *キューに戻すようにすることができます。次に、手順1を「local_queue_size

+0

@j_random_hacker:これは良い考えです。ローカルキューはデータフローを複雑にし、メリットは疑わしい。十分なプロセッサがない場合は、追加してください。ドメインキューが大きすぎる場合は、シャーディングを追加してください。 –

+0

@Alex:「シャーディング」の意味を理解していれば、自分の提案が導入するデータフローの複雑な問題(つまり、ローカルドメインをグローバルキューに戻す)が、1つまたは複数のプロセッサアイドル。効果的に「自動シャーディング」と回復メカニズムを組み合わせたものです。もちろん、shardを先験的に定義する必要はなく、シャーディングのすべての利点(および非効率性)を持つ簡単な実装のための回復メカニズムを省略することもできます。 –