Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

バッチ処理のためのタスクキュー

タスクキュー とは、時間と負荷のかかるバッチ処理をバックグラウンドで安全に実行するための仕組みです。

システム管理者が タスク をリクエストすると、タスクは キュー に入り、順番に実行されます。キューに入っている状態で、同じパラメーターでタスクを複数回リクエストしても、同じタスクが複数回実行されることはありません。また一度に1つであればシステムの負荷にならないタスクであっても、同時に10個実行するとシステムに大きな負荷を与えてしまう可能性があります。そういった負荷の高いタスクを適切な並行数で順番に実行することにより、システムの負荷を平準化します。

タスクをリクエストしてから実行が完了するまでの流れを次に示します。

flowchart TB

subgraph trigger [リクエスト元]
  admin["システム管理者<br />(タスクキュー画面)"]
  scheduler["スケジュール設定<br />(定期実行/日時指定)"]
end

subgraph queue [タスクキュー]
  dedup{"同じ種別と<br />パラメーターのタスクが<br />すでにキューにあるか"}
  lane["キュー (レーン)<br />タスク種別ごとに分離<br />(同時実行数を制御)"]
  ignore[リクエストを無視]
end

subgraph execution [実行]
  worker["ワーカー"]
  target[("ソース LDAP<br />外部サービス<br />ファイル")]
end

admin -- タスクをリクエスト --> dedup
scheduler -- タスクをリクエスト --> dedup
dedup -- ある --> ignore
dedup -- ない --> lane
lane -- "FIFO で取り出し" --> worker
worker -- 読み書き --> target
worker -- 実行結果 --> history[タスクの実行状況]

機能

UCIDM では次の処理をタスクキューを介して順番に実行します。

スケジュール実行によるタスク処理

UCIDM には スケジュール設定機能 があります。定期実行やあらかじめ指定した日時でタスクを実行できます。

  • CSV 一括処理
  • ユーザーエントリーのライフサイクル処理
  • 不要ファイルの削除処理

ソース LDAP に対するタスク処理

システム設定により、さまざまな機能があります。それらの機能を有効にした後、設定反映や同期処理をすべてのユーザーエントリーに実施したいときがあります。そういった任意のタイミングのバッチ処理をタスク実行します。

実行モデル

配送保証は at-least-once です。タスクの実行中にサーバー停止などで中断したタスクは、サーバー起動後に最初から再実行されます。

タスクはキューに入ると、入った順番に実行されます (FIFO) 。同時実行数が1のキューは、実行中にエラーが発生して失敗しない限り、実行順序が保証されます。

タスクの状態は次のように遷移します。

stateDiagram-v2

state "実行待ち" as waiting
state "実行中" as running
state "完了" as done
state "失敗" as failed
state "キャンセル" as canceled

[*] --> waiting: タスクをリクエスト
waiting --> running: ワーカーが取り出す
waiting --> canceled: 待ち状態のタスクを削除する
running --> done: 正常終了
running --> failed: エラーが発生
running --> canceled: 実行中のタスクをキャンセルする
running --> waiting: サーバー停止などで中断 (起動後に最初から再実行)
done --> [*]
failed --> [*]
canceled --> [*]

設定・監視

タスクの制御ならびに実行状況は タスクキュー画面 で確認できます。

前の処理を実行中でキューで待ち状態のタスクは削除することで実行をキャンセルできます。また、実行中タスクをキャンセルすることもできますが、すでに実行されて変更されてしまった結果を元に戻すことはできません。

Last updated on unknown (main@)