まず「cronjobを1つのノードだけで実行する」の意味を決めます。**同時実行の防止と、業務上の効果が繰り返されることの防止は別の要件です。**共有スケジューラーは実行を調整しますが、処理自体も障害後の再試行に耐えなければなりません。
3つのNestJSノードに配置した日次請求ジョブを考えます。予定した処理を実行しつつ、ワーカーの再起動で別の請求書を作らないようにしたい状況です。
1. すべてのノードが開始する理由を理解する
各アプリケーションインスタンスは自分のcronコールバックを登録します。予定時刻になると、それぞれが独立して開始できます。
00:00 -> Node A -> invoice task
-> Node B -> invoice task
-> Node C -> invoice task
ローカルのisRunningフラグは1つのプロセスにしか存在しません。NestJSのwaitForCompletionはそのインスタンス内のコールバック重複を防げますが、他のノードとは調整しません。同じフラグを3つのノードに追加しても、判断は3つに分かれたままです。。
