Python/Django/Celery ベースの展開ツールの場合、次のセットアップがあります。
- 現在、デフォルトの Celery セットアップを使用しています。(「セロリ」と呼ばれる 1 つのキュー + 交換。)
- キューの各タスクは、展開操作を表します。
- 環境の各タスクは、(非常に) 時間がかかる可能性がある同期フェーズで終了します。
次の仕様を満たす必要があります。
- 並行性 : 複数の環境のタスクを同時に実行する必要があります。
- ロック:各環境で同時に実行されるタスクは最大で 1 つです (つまり、環境ロック)。
- スループットの最適化: 1 つの環境に複数のタスクがある場合、それらの同期フェーズを組み合わせて最適化することができます。そのため、タスクが終了間近になった場合、この環境のキューで待機している新しいタスクがあるかどうかを確認し、ある場合は同期フェーズをスキップする必要があります。
これを実装するための好ましい方法は何ですか?
いくつかの考え:
- 環境ごとに 1 つずつ、複数のキューを設定する必要があると言えます。また、N 個のセロリ ワーカーがそれぞれ 1 つのキューを排他的に処理する必要があります。(これで仕様 1+2 は解決されます。)
しかし、複数のセロリ ワーカーが異なるキューを排他的にリッスンするにはどうすればよいでしょうか? - 環境のキューで待機しているタスクが他にもあることを知る明確な方法はありますか?