【Digdag】ワークフローのScheduling

スポンサーリンク

Digdag ワークフローのスケジューリングについて。

Schedule設定

ワークフローを定期的に実行するには schedule オプションを使用します。

timezone: UTC

schedule:
  daily>: 07:00:00

Scheduling workflow — Digdag 0.9.35 documentation

Syntax Description Example
hourly>: MM:SS MM:SSで毎時実行します hourly>: 30:00
daily>: HH:MM:SS HH:MM:SSで毎日実行します daily>: 07:00:00
weekly>: DDD,HH:MM:SS DDD曜日のHH:MM:SSで毎週実行します weekly>: Sun,09:00:00
monthly>: D,HH:MM:SS 毎月D日のHH:MM:SSで毎週実行します monthly>: 1,09:00:00
minutes_interval>: M M分毎に実行します minutes_interval>: 30
cron>: CRON CRON形式で実行します cron>: 42 4 1 * *

セッション時間

Digdag にはセッション時間という考え方があります。通常バッチ処理では、前日分のデータを使用するために 2019-04-05 00:00:00 ~ 2019-04-06 00:00:00 のような時間を指定します。そのため daily>: "03:00:00" でスケジュール指定した場合でも 実行日 00:00:00 の時間が欲しい訳です。以下の表に示したようなセッション時間が session_time などの変数セットされてワークフローで使用できます。このセッション時間は Digdag 上でリトライする時にも該当時間がセットされます。

Schedule セッション時間 実行時間
hourly>: “32:32” 2019-02-24 14:00:00 +0900 2019-02-24 14:32:32 +0900
daily>: “10:32:32” 2019-02-25 00:00:00 +0900 2019-02-25 10:32:32 +0900
weekly>: “2,10:32:32” 2019-02-26 00:00:00 +0900 2019-02-24 14:32:32 +0900
monthly>: “2,10:32:32” 2019-03-02 00:00:00 +0900 2019-03-02 10:32:32 +0900

skip_on_overtime

skip_on_overtime: true|false は、別のセッションがすでに実行されている場合にスケジュールされたセッションの実行をスキップするかどうかを制御するためのオプションです。同時実行が出来ないバッチ処理などはこのオプションを指定することをおすすめします。

動作を分かりやすくするために以下のようなワークフローを使用して確認してみましょう。

timezone: UTC

schedule:
  minutes_interval>: 10
  skip_on_overtime: true

+setup:
  echo>: start ${session_time}

+log1:
  echo>: last_session_time ${last_session_time}

+log2:
  echo>: laste_executed_session_time ${last_executed_session_time}

+wait:
  sh>: sleep 630

+teardown:
  echo>: finish ${session_time}

10分毎にスケジュール実行されるワークフローですが、途中で wait を11分入れているので 1 セッション内で処理が終わりません。セッション実行中に次のセッション時間になると以下のようなメッセージが表示されてセッションがスキップされます。

2019-04-17 15:10:00 +0000 [INFO] (scheduler-0): An attempt of the scheduled workflow is still running and skip_on_overtime = true. Skipping this schedule: StoredSchedule{id=1, projectId=1, createdAt=2019-04-17T14:58:03.509Z, updatedAt=2019-04-17T15:00:00.704Z, lastSessionTime=2019-04-17T15:00:00Z, workflowName=schedule_test, workflowDefinitionId=1, nextRunTime=2019-04-17T15:10:00Z, nextScheduleTime=2019-04-17T15:10:00Z}
2019-04-17 15:10:00 +0000 [INFO] (scheduler-0): Updating next schedule time: sched=StoredSchedule{id=1, projectId=1, createdAt=2019-04-17T14:58:03.509Z, updatedAt=2019-04-17T15:00:00.704Z, lastSessionTime=2019-04-17T15:00:00Z, workflowName=schedule_test, workflowDefinitionId=1, nextRunTime=2019-04-17T15:10:00Z, nextScheduleTime=2019-04-17T15:10:00Z}, next=ScheduleTime{runTime=2019-04-17T15:20:00Z, time=2019-04-17T15:20:00Z}, lastSessionTime=null

スキップされたセッションは Status が Skip とかで記録されて管理画面上から確認できるかと思ってましたが実際は何も表示されません。

注意事項としてスキップされている状態で次のセッションまでの時間にワークフローを push するとスキップされていたセッションが実行されます。

last_executed_session_time

スキップされたセッションはどうすれば良いでしょうか? 手動で再実行するのは避けたい手段です。 laste_executed_session_time は最後に実行されたセッションの時間が設定されるので、次のセッションでスキップされたセッションの分も含めて処理することが可能です。以下は 15:10:00 のセッションがスキップされたため last_session_time には 15:10:00 が、 laste_executed_session_time には 15:00:00 がセットされています。

2019-04-17 15:20:01 +0000 [INFO] (0045@[0:schedule_test]+schedule_test+setup): echo>: start 2019-04-17T15:20:00+00:00
start 2019-04-17T15:20:00+00:00
2019-04-17 15:20:03 +0000 [INFO] (0045@[0:schedule_test]+schedule_test+log1): echo>: last_session_time 2019-04-17T15:10:00+00:00
last_session_time 2019-04-17T15:10:00+00:00
2019-04-17 15:20:04 +0000 [INFO] (0045@[0:schedule_test]+schedule_test+log2): echo>: laste_executed_session_time 2019-04-17T15:00:00+00:00
laste_executed_session_time 2019-04-17T15:00:00+00:00
2019-04-17 15:20:06 +0000 [INFO] (0045@[0:schedule_test]+schedule_test+wait): sh>: sleep 630