次のシナリオに最適な(最速の)アルゴリズムについて誰かがアイデアを持っているかどうかを尋ねたいと思います。
- X プロセスは、非常に大きなファイルのリストを生成します。各プロセスは一度に 1 つのファイルを生成します
- ファイルの準備ができたことが Y プロセスに通知されています。各 Y プロセスには、通知を収集するための独自のキューがあります
- ある時点で、1 つの X プロセスが、ラウンド ルービン アルゴリズムを持つロード バランサーを介して 1 つの Y プロセスに通知します。
- 各ファイルにはサイズがあり、当然ながら、ファイルが大きいほど X と Y の両方が忙しくなります
制限事項
- ファイルが Y プロセスに入ると、それを削除して別の Y プロセスに移動するのは現実的ではありません。
現時点では、他の制限は考えられません。
このアプローチの欠点
- ときどき X が遅れます (ファイルがプッシュされなくなります)。キューイングシステムの影響はあまり受けず、変更しても遅い/良い時間があります.
- ときどき Y が遅れます (大量のファイルがキューに集まります)。繰り返しますが、以前と同じことです。
- 1 Y プロセスは非常に大きなファイルでビジーです。また、キューにはいくつかの小さなファイルがあり、他の Y プロセスが引き継ぐ可能性があります。
- 通知自体は HTTP 経由で行われるため、信頼できない場合があります。通知は失敗し、デバッグは何も明らかにしませんでした。
画像をより明確に見るのに役立つ詳細がいくつかあります。
- Y プロセスは DB スレッド/ジョブです
- X プロセスは Web アプリです
- ファイルが X プロセスに到達すると、これらもクエリを実行して DB 側からリソースを消費します。制作部分に影響あり
今、私は次のアプローチを検討しました:
- X は以前と同様にファイルを生成しますが、Y には通知しません。ファイル リストを作成するためのバッファ (テーブル) を保持します。
- Y は常にバッファ内のファイルを検索し、それらを取得して独自のキューに格納します。
さて、この変更は実用的でしょうか? 私が言ったように、各 Y プロセスには独自のキューがあり、それを保持するのは効率的ではないようです。もしそうなら、私はまだ次のビットについて未定です:
取得するファイルを決定する方法
私はナップザックの問題を読みましたが、最初からファイルのリスト全体を持っている場合、それは適用できると思いますが、私は持っていません。実際、私は各ファイルのリストとサイズを持っていますが、各ファイルをいつ取得できるようになるかはわかりません。
私は生産者と消費者の問題を経験しましたが、それは固定バッファーとそれを最適化することを中心にしていますが、このシナリオではバッファーは無制限であり、それが大きいか小さいかはあまり気にしません。
次善の策は、各 Y プロセスが最小のファイルをロックして取得する貪欲なアプローチです。最初はそれが最速のアプローチのように見えます。私は現在それを検証するためのシミュレーションを構築していますが、セカンドオピニオンは素晴らしいでしょう.
更新 誰もが全体像を把握できるようにするために、ここに簡単に作成した図をリンクします。
- ジョブはプロセスから独立しています。それらは高速で実行され、可能なファイル数を処理します。
- ジョブがファイルで終了すると、HTTP リクエストが LB に送信されます
- 各プロセスは、LB からの要求 (ファイル) をキューに入れます
- LB はラウンド ロビン ルールで動作します