CNCFにおけるジョブ管理

Created: 2026-06-08

CQRSを採用するシステムでは、更新処理は非同期実行になることが少なくありません。

その場合、処理の完了確認や結果取得をどのように行うかが重要になります。

CNCFでは、この課題に対応するためにジョブ管理機能を提供しています。

本稿では、CNCFのジョブ管理モデルについて解説します。

なぜジョブ管理が必要なのか

CNCFではCQRSを採用しています。

CQRSでは、更新処理(Command)と参照処理(Query)を分離します。特に更新処理はEventually Consistentな構成を採用することが多く、実行は必然的に非同期処理になります。

非同期処理で最も重要なことは、処理結果を後から確認できることです。

利用者やシステムは、処理の完了を確認し、必要に応じて完了を待ち合わせ、最終的な結果を取得できなければなりません。

この問題に対応するため、CNCFはジョブ管理機能を提供しています。

ジョブ管理が提供するもの

ジョブ管理は単なる非同期実行基盤ではありません。実行の追跡、失敗の診断、再実行、監査記録など、運用上必要となる機能も提供します。

  • 完了追跡

  • 結果取得

  • 再実行

  • キャンセル

  • 診断

  • 監査記録

AI時代では、実行データが保存・管理されていること自体が重要な価値を持ちます。Jobが保持する履歴、入力、結果、失敗理由、再実行履歴、診断情報は、障害調査、性能分析、セキュリティ監査、生成AIによる原因分析のための運用データになります。

実行モード

CNCFでは、オペレーションはQueryまたはCommandとして実行します。Queryは同期型ですが、Commandでは以下の4つの実行モードを提供しています。

Sync

最も単純な同期実行です。Jobは生成されません。

JobSync

同期実行ですが、Jobとして管理されます。

結果は同期的に返されますが、Job履歴や診断情報が保持されます。

JobAsync

非同期実行です。

呼び出し側にはJob IDが返され、実際の処理は後続ワーカーによって実行されます。

ここでいう非同期とは、主に「呼び出し側から見た非同期」です。Jobとして受理された後、ワーカー内で実行されるCommand本体は、基本的には同期的な処理単位として進みます。

ただし、Command本体の中でEventを発行した後、そのEventを契機に行われる派生処理は、別Taskとして非同期に分離できます。Event発行時には、後続処理をその場で同期的に実行するか、別Taskとして非同期に実行するかを定義できます。つまり、JobAsyncは「Job全体がすべて非同期に細切れで動く」という意味ではなく、「呼び出し側とは非同期に進み、内部では同期的なTaskとEvent以降の同期/非同期Taskを組み合わせられる」実行モードです。

JobSyncWithAsyncCont

主処理は同期的に実行し、残りの処理だけを非同期継続として実行します。

利用者は即座に結果を受け取れますが、その後の処理も同じJobの下で追跡できます。

Jobライフサイクル

Jobは単に作成されるだけではなく、状態を持って管理されます。状態は実装詳細に依存しますが、概念的には以下のようなライフサイクルになります。

  • Accepted : 受付済み

  • Scheduled : スケジュール済み

  • Running : 実行中

  • Succeeded : 成功

  • Failed : 失敗

  • Cancelled : キャンセル

JobAsyncでは、呼び出し時点では処理は完了していないため、呼び出し側はJob IDを使って状態を取得します。JobSyncやJobSyncWithAsyncContでも、Job履歴として状態・結果・診断情報が残るため、後から実行内容を確認できます。

Jobが保持する代表的な情報は以下です。

  • Job ID

  • Operation / Command名

  • 要求者 / principal

  • 受付時刻

  • 開始時刻

  • 完了時刻

  • 実行モード

  • 状態

  • 結果概要

  • エラー (error) / 結論

  • 診断情報

  • 再実行回数

  • キャンセル理由

  • コール・ツリー

実行結果に加えて、コール・ツリーなどの内部実行情報も記録されるため、障害調査や性能改善にも有効な情報を提供できます。

呼び出し側の利用モデル

非同期Commandでは、呼び出し側は最終結果を即座に受け取るのではなく、Job IDを受け取ります。その後、必要に応じて状態確認、待ち合わせ、結果取得を行います。

  • Commandを投入する

  • Job IDを受け取る

  • 状態を確認する

  • 必要に応じて待つ

  • 結果を取得する

このモデルにより、UI、CLI、外部システム、AIエージェントは同じJob管理インタフェースを利用できます。

5層実行モデル

CNCFの実行モデルは、次の5層モデルで整理されています。

Saga
 └─ Job
      └─ Task
           └─ Transaction
                └─ Event

この図は包含関係を示していますが、実行時にはEventが後続Taskを起動する境界にもなります。典型的には、Command本体のTaskは同期的に実行され、その中でTransactionが成立し、Eventが発行されます。その後、Eventハンドラや外部通知、集計更新、インデックス更新などは、Event定義または購読定義に従って、同期的に継続することも、別Taskとして非同期に実行することもできます。

  • JobAsync

    • Task A : Command本体。worker内では同期的に実行されます。

    • Transaction : 整合性境界です。

    • Event : Transactionの結果として発行されます。

    • 同期型購読: 同じ実行フローで処理されます。

    • 非同期型購読: Task B や継続処理として分離されます。

Saga

サブシステムをまたぐ長時間実行の業務プロセスを管理します。Sagaは分散トランザクションの代替として、補償処理を用いて最終的な整合性を実現します。

Job

Jobはサブシステム内の実行管理単位です。

Task

Jobを構成する観測可能な作業単位です。

Taskは必ずしもJob全体と一対一ではありません。Command本体を実行するTaskと、Event発行後に起動される派生Taskを分けることで、主処理と副作用的な後続処理を独立して観測・再実行・診断できます。ただし、すべてのEvent購読が別Taskになるわけではありません。同期型の購読は同じ実行フロー内で処理され、非同期型の購読だけが独立したTaskとして管理されます。

Transaction

整合性を保証する境界です。Taskとは独立した概念です。

Event

状態変化や業務上の事実を表します。

Eventは単なる履歴ではなく、後続処理を開始する接続点にもなります。Event発行時の後続処理には、同期型と非同期型があります。同期型はEvent発行元の実行フローの中で処理され、同じTaskまたはTransaction境界の近くで完了します。非同期型はEventを契機に別Taskとして起動され、呼び出し元の完了とは分離して管理されます。このため、CNCFではCommandの同期的な中核処理と、Event以降の同期/非同期の派生処理を分けて扱えます。

まとめ

CNCFのJob管理は、Commandの業務的意図と実行管理を分離するための仕組みです。Commandは「何を行うか」を表し、Jobは「どのように実行され、どの状態にあり、どのような結果になったか」を管理します。

これにより、同期実行、同期実行+履歴管理、非同期実行、同期実行+非同期継続を一貫したモデルで扱えます。さらに、Saga・Job・Task・Transaction・Eventの5層モデルにより、長時間実行、作業単位、整合性境界、業務イベントを分離して管理できます。

AI時代においては、Job管理が保持する実行データは、障害調査、監査、性能分析、運用自動化のための重要な知識源になります。

参照

用語集

Cloud Native Component Framework (CNCF)

Cloud Native Component Framework(CNCF)は、クラウド・アプリケーションを構成するコンポーネントを、単一かつ一貫した実行モデルで実行するためのフレームワークです。 Component / Service / Operation という構造を中核とし、command、server(REST / OpenAPI)、client、script といった異なる実行形態から、同一の Operation を再利用できることを特徴とします。 ログ、エラー処理、設定、配備といったクラウド・アプリケーションに必要な品質属性をフレームワーク側に集約することで、コンポーネントはドメイン・ロジックの実装に集中できます。 CNCF は、文芸モデル駆動開発および AI 支援開発を前提に、「何を実行するか」と「どのように呼び出すか」を分離するための実行基盤として設計されています。

エラー (error)

汎用的な表現として用いられる用語。ソフトウェア工学では多義的に使われ、バグや障害全般を指す。SimpleModeling では広義のラベルとして使用し、個別には Mistake・Defect・Fault・Failure・Deviation に整理する。