私は、HTTP経由でさまざまなドキュメントを取得して処理するためにジョブを多くのマシンに渡すジョブキュー(Amazon SQSを使用)を持っています。アクセスされる数百の異なるホストがあり、ジョブのための予測可能な順序はありません。自己再配置ジョブキューのメソッド
礼儀正しくするために、私のシステムが単一のホスト上で繰り返しハンマーを鳴らすことは望ましくありません。したがって、example.comから何かを取得するために#123のジョブを取得しても、過去X秒間にexample.comから別のものを取得しただけの場合は、別のものに移動してジョブ#123を保存する必要があります後で。
このパターンを実装するにはどうすればよいでしょうか。
ジョブランナーは、すべてのドメインのどこかにリストを保存し、そのドメインの何かにアクセスした最後の時間を持つようにするのが最初の手順です。私はこれが単純なDBテーブルかもしれないと思います。
メッセージプロセッサが延期する必要があるジョブを取得した場合の対処方法は、さまざまな可能性があります。
メッセージのコピーをキューの最後にプッシュし、実行せずに放棄します。うまくいけば、次に来るときに、十分な時間が経過するでしょう。これにより、特に同じドメインの大規模なクラスタが一度に通過する場合に、冗長なSQSメッセージが多数発生する可能性があります。
丁寧さがジョブの実行を指示するまで数秒間スリープする必要があります。これにより、多くのキュープロセッサが同時に何もしなくなる可能性があります。
ジョブを受け入れますが、各キュープロセッサのどこかのローカルキューに保存します。私は各プロセッサがこのようにしていくつかの仕事を「主張する」ことができると思っています。そして、最大の礼儀を達成する順序でそれらを処理することを選択します。これは、各キュープロセッサが他のキュープロセッサにヒットしたドメインを認識する必要があるため、予測できないことがあります。
ドメインごとに個別のキューを設定し、各キュー専用の1つのプロセスを用意します。各プロセスは各ジョブの実行の間にX秒間休止する必要があるため、プロセスのオーバーヘッドが大きくなりますが、これは悪いことではありません。
このようなことを設計する経験はありますか?どのような戦略をお勧めしますか?
SQSに100%固定ですか?ドメインごとのキューソリューションにあなたを強制するわけではありませんが、SQSが提供していないと確信しているキューを直接制御する必要があります(正確に言うと、基本的には、挿入されずに純粋なキューではなく、二重リンクされたリストとして扱われます)。 – DVK