(Amazon SQSを使用して)ジョブキューがあり、HTTPを介してさまざまなドキュメントをフェッチして処理するために多くのマシンにジョブを渡します。アクセスされるホストは数百あり、ジョブの順序は予測できません。
礼儀正しくするために、私は自分のシステムが単一のホストで繰り返しハンマーを打つことを望まない。したがって、example.comから何かをフェッチするためにジョブ#123を取得したが、過去X秒間にexample.comから別のものをフェッチしたことがわかった場合は、別の何かに移動してジョブ#123を保存する必要があります。後で。
問題は、このパターンを実装するための良い方法は何ですか?
最初のステップは、ジョブランナーにすべてのドメインのリストを保持させ、そのドメインの何かに最後にアクセスしたときのようです。これは単純なDBテーブルである可能性があると思います。
その場合、メッセージプロセッサが延期する必要のあるジョブを取得した場合の対処方法には多くの可能なオプションがあります。
メッセージのコピーをキューの最後にプッシュし、実行せずに破棄するだけです。うまくいけば、次にそれが来るときまでに、十分な時間が経過するでしょう。これにより、特に同じドメインのジョブの大規模なクラスターが一度に通過する場合に、冗長なSQSメッセージが多数発生する可能性があります。
ただし、礼儀正しさがジョブの実行を指示するまで、何秒もスリープする必要があります。これにより、多くのキュープロセッサが同時に何もしない可能性があります。
ジョブを受け入れますが、各キュープロセッサのどこかにあるローカルキューに保存します。各プロセッサがこの方法で多数のジョブを「要求」し、最大の礼儀正しさを実現する順序でそれらを処理することを選択できると思います。各キュープロセッサは、他のすべてのドメインがヒットしたドメインを認識する必要があるため、これは依然として予測できない可能性があります。
ドメインごとに個別のキューを確立し、各キュー専用の1つのプロセスを用意します。各プロセスは、各ジョブを実行する間にX秒間一時停止する必要があるため、スリープ状態のプロセスのオーバーヘッドが多くなりますが、これはそれほど悪いことではないかもしれません。
このようなものをデザインした経験はありますか?どのような戦略をお勧めしますか?