「定時実行」と「定期実行」の設計ガイド

定時実行と定期実行の設計

この記事の論点を、実際のスケジューリング設計で再利用できる判断基準として思い出せるように確認します。

基本概念

  1. 「毎日9時に実行」のように、絶対的な時刻を基準に動かす方式を(1)という。
  2. 「10分ごとに実行」のように、前回の実行などを基準に一定間隔で動かす方式を(2)という。
  3. 定期実行が定時実行より難しい本質的な理由は、時間に(3)がないためである。
  4. 定時実行のスケジュールを途中の時刻から開始するとき、最初に決めておくべきなのは、スケジュール開始時に(4)である。
  5. 定時実行では、最初の実行だけが通常の繰り返しと異なるため、初回だけ動く(5)と、繰り返す本処理を分けて実装するとよい。
  6. 定時実行の初回実行について考える必要があるのは、初回デプロイ時だけでなく、スケジューラの(6)時も含まれる。

タスク遅延と異常時の設計

  1. 定時実行では、前のタスクが次の実行時刻までに終わらない場合に、タスクを中断するか、並行して次を開始するか、(7)かをあらかじめ検討する。
  2. 前のタスクが終わらない理由が解決しないまま次のタスクを並行実行すると、プロセスが増え続け、最終的に(8)可能性がある。
  3. 著者は、スケジュール処理の異常をプログラム内の例外処理だけで無理に解決せず、基本的には(9)方針を支持している。
  4. 実行環境の前提が崩れている場合、タスクやスケジューラがその環境自体を直すことは本来の(10)。
  5. 異常時に人間を呼ぶ設計が必要なのは、プログラムが自己解決したように見えて実際には失敗していた場合、発見が(11)危険があるためである。
  6. タスクが普段は短時間で終わっていても、障害時には長期間終わらないことがあるため、「タスクが時間内に終わるとは(12)」という前提で設計する。

リトライ

  1. リトライを無制限に続けると、サーバのリソースを消費したり、相手サービスから(13)危険がある。
  2. リトライして解決できる問題は、著者の見解では(14)。
  3. リトライを採用する場合、必ず決めるべきものは、リトライの(15)である。
  4. リトライ間隔を、2分、4分、8分のように段階的に増やす方式を(16)という。
  5. タスク側の重要な責務は、無駄にリトライし続けることではなく、失敗原因をできるだけ高い(17)で出力して終了することである。
  6. スケジューラ側の重要な責務は、失敗を隠さず、なるべく即座に、なるべく(18)人間へ伝えることである。

タスク欠損と依存関係

  1. 定時実行では、現在のタスクの前提として、それ以前のタスクも同じように実行されているという(19)が潜んでいることがある。
  2. 定時実行の設計では、前回のタスクが(20)ことを前提にする必要がある。
  3. 前のタスクが欠損しても後続タスクへの影響を小さくするには、前後のタスクを極力(21)させる。
  4. 「今残っているデータを全部処理する」のではなく、各タスクが自分の担当する(22)だけを処理するようにすると、タスク欠損の影響を抑えやすい。
  5. 前のタスクへのリンク付けや差分計算、整合性検査は、後続タスク本体から(23)する設計が望ましい。
  6. 整合性が厳密に必要で、1回の失敗が後続すべてに影響する場合は、余計な処理を続けず全体を(24)方が被害を抑えられることがある。

タスク重複と冪等性

  1. リトライや実行中の再起動によって、途中まで作成されたファイルが残った状態で同じタスクが再実行されると、タスクの(25)が発生する。
  2. 定時実行で「その時間に1回だけ実行する」ことを保証したい場合、タスク開始時に、その時間の実行回数と(26)を確認できる情報を保存しておく必要がある。
  3. 同じ処理を複数回実行しても結果が壊れないようにする性質を(27)という。
  4. ファイル削除のように副作用が大きく冪等化が難しい処理では、集計と(28)を別タスクに分け、しばらくデータを残す設計が考えられる。
  5. 重要な副作用を伴う処理では、自動的に実行し続けるのではなく、最終的な副作用部分を人間が確認してから(29)する方法もある。
  6. 設計上、「一度だけ確実に実行する」ことは(30)ため、重複を完全に排除できない場合の扱いも検討する必要がある。

※回答内容が保存され、問題作成者が閲覧できます

出題内容

  • 問1: 「毎日9時に実行」のように、絶対的な時刻を基準に動かす方式を____という。「10分ごとに実行」のように、前回の実行などを基準に一定間隔で動かす方式を____という。定期実行が定時実行より難しい本質的な理由は、時間に____がないためである。定時実行のスケジュールを途中の時刻から開始するとき、最初に決めておくべきなのは、スケジュール開始時に____である。定時実行では、最初の実行だけが通常の繰り返しと異なるため、初回だけ動く____と、繰り返す本処理を分けて実装するとよい。定時実行の初回実行について考える必要があるのは、初回デプロイ時だけでなく、スケジューラの____時も含まれる。
  • 問2: 定時実行では、前のタスクが次の実行時刻までに終わらない場合に、タスクを中断するか、並行して次を開始するか、____かをあらかじめ検討する。前のタスクが終わらない理由が解決しないまま次のタスクを並行実行すると、プロセスが増え続け、最終的に____可能性がある。著者は、スケジュール処理の異常をプログラム内の例外処理だけで無理に解決せず、基本的には____方針を支持している。実行環境の前提が崩れている場合、タスクやスケジューラがその環境自体を直すことは本来の____。異常時に人間を呼ぶ設計が必要なのは、プログラムが自己解決したように見えて実際には失敗していた場合、発見が____危険があるためである。タスクが普段は短時間で終わっていても、障害時には長期間終わらないことがあるため、「タスクが時間内に終わるとは____」という前提で設計する。
  • 問3: リトライを無制限に続けると、サーバのリソースを消費したり、相手サービスから____危険がある。リトライして解決できる問題は、著者の見解では____。リトライを採用する場合、必ず決めるべきものは、リトライの____である。リトライ間隔を、2分、4分、8分のように段階的に増やす方式を____という。タスク側の重要な責務は、無駄にリトライし続けることではなく、失敗原因をできるだけ高い____で出力して終了することである。スケジューラ側の重要な責務は、失敗を隠さず、なるべく即座に、なるべく____人間へ伝えることである。
  • 問4: 定時実行では、現在のタスクの前提として、それ以前のタスクも同じように実行されているという____が潜んでいることがある。定時実行の設計では、前回のタスクが____ことを前提にする必要がある。前のタスクが欠損しても後続タスクへの影響を小さくするには、前後のタスクを極力____させる。「今残っているデータを全部処理する」のではなく、各タスクが自分の担当する____だけを処理するようにすると、タスク欠損の影響を抑えやすい。前のタスクへのリンク付けや差分計算、整合性検査は、後続タスク本体から____する設計が望ましい。整合性が厳密に必要で、1回の失敗が後続すべてに影響する場合は、余計な処理を続けず全体を____方が被害を抑えられることがある。
  • 問5: リトライや実行中の再起動によって、途中まで作成されたファイルが残った状態で同じタスクが再実行されると、タスクの____が発生する。定時実行で「その時間に1回だけ実行する」ことを保証したい場合、タスク開始時に、その時間の実行回数と____を確認できる情報を保存しておく必要がある。同じ処理を複数回実行しても結果が壊れないようにする性質を____という。ファイル削除のように副作用が大きく冪等化が難しい処理では、集計と____を別タスクに分け、しばらくデータを残す設計が考えられる。重要な副作用を伴う処理では、自動的に実行し続けるのではなく、最終的な副作用部分を人間が確認してから____する方法もある。設計上、「一度だけ確実に実行する」ことは____ため、重複を完全に排除できない場合の扱いも検討する必要がある。

...他25問(続きはテストで確認!)