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