バッチアプリケーションのアーキテクチャ⚓︎
AlesInfiny Maia OSS Edition (以降、 AlesInfiny Maia)において、バッチアプリケーションを構築する際に想定しているアーキテクチャの概要について説明します。
技術スタック⚓︎
本アーキテクチャを構成する主なライブラリを以下に示します。
なお、本アーキテクチャでは、図の通り クライアントサイドレンダリング方式のバックエンドアプリケーション の一部を参照しています。 具体的には、バックエンドアプリケーションのアプリケーションコア層およびインフラストラクチャ層を参照することでロジックを再利用しているほか、プレゼンテーション層にあたる部分をバッチアプリケーションで設けたバッチ層が置換している形です。 Web アプリケーションの利用ライブラリについては、こちら をご覧ください。
利用ライブラリ⚓︎
バッチアプリケーションに必要なライブラリについて説明します。
-
トランザクション管理、ジョブ処理統計、開始 / 停止 / スキップ、エラーハンドリング、フロー制御、リソース管理、大量のレコード処理といったバッチ処理機能を提供します。
-
Spring Batch ベースのテストを実行するライブラリです。 ジョブを起動・実行するためのテストセットアップを使用できます。
Spring Batch のアーキテクチャ⚓︎
Spring Batch のバッチ処理方式⚓︎
Spring Batch 上でバッチ処理を実行する際の流れを以下に示します。
上図で記載されている各クラスの説明は以下の通りです。
-
起動時にコンテキストで
Job
が見つかった場合に、自動的に実行されます。 複数のJob
がある場合には、起動時に実行するJob
名をapplication.properties
のspring.batch.job.name
で指定できます。 その後、Job
を起動するためのJobLauncherApplicationRunner
を呼び出します。 このクラスは、@SpringBootApplication
を使用している場合に自動的に有効となります。 -
Spring Batch アプリケーションの
Job
を起動するためのApplicationRunner
クラスです。BatchAutoConfiguration
によって自動的に実行されます。 -
Job
を起動するためのインターフェースです。 指定されたジョブを呼び出し、バッチ処理を開始します。 -
JobExecution
やStepExecution
等のバッチアプリケーションのジョブ実行履歴やジョブの実行状態を表したメタデータの管理・永続化を実現する機能を提供します。 -
Job
を管理する実行単位です。 失敗したJob
を再実行すると、新しいJobExecution
が作成されます。 -
Step
を管理する実行単位です。Job
自身に登録されているStep
を起動し、StepExecution
を生成します。 -
Step
は、Job
を構成する処理の単位であり、 1 つのJob
に複数のStep
を指定可能です。 コミット間隔などの設定に基づき、ビジネスロジックを初期化してトランザクション管理を実現します。 -
Chunk
とは、 1 つずつデータを読み取り、中間コミットを発行して動作状態を保存しながらバッチ処理を行う仕組みを提供するクラスです。Chunk
モデルでは、以下の 3 段階の処理からなります。-
ItemReader
DB やファイルからデータを取得し、 ItemProcessor に渡します。
-
ItemProcessor
ItemReader から受け取ったデータを変換します。
-
ItemWriter
変換したデータを DB やファイルに書き込みます。
Spring Batch における
Chunk
の詳細は チャンク指向の処理 をご覧ください。 -
-
Job
を全体で 1 回のコミットで処理する仕組みを提供するクラスです。Chunk
モデルのようにItemReader
やItemProcessor
、ItemWriter
と処理を分ける必要がないため、実装に慣れていない開発者にとっては実装しやすい特徴があります。 また、バッチ処理の実装が 1 クラスにまとまり見通しがよくなります。
Chunk モデルと Tasklet モデルの使い分け
Spring Batch では、バッチ処理の性質によって、 Chunk
モデルと Tasklet
モデルを使い分けることが推奨されています。 以下に示す観点に基づき、各バッチ処理に応じてどちらのモデルを使用するかを考慮することで、状況に応じたモデルの併用を実現しましょう。
-
データ処理量
Chunk
モデルは、一定件数で中間コミットを発行しながら処理を実施します。これに対し、Tasklet
モデルは一括コミットにて処理することが基本です。 処理するデータが大量になると、一括コミットするTasklet
モデルではリソースが枯渇し正常に処理できない可能性があります。 大量のデータを安定して処理する必要がある場合には、Chunk
モデルを使用するとよいでしょう。 -
ジョブの再開能力
Chunk
モデルは、件数ベースのリスタートを実現できます。これにより、エラーとなったデータ以降からバッチ処理を再開することができます。 これに対しTasklet
モデルは、 1 つのTasklet
が完全に成功するか失敗するかのどちらかとなり、失敗した場合は処理を再実行することになります。 エラーとなったジョブを再実行するのみで復旧する場合はTasklet
モデルを、バッチジョブを完了する必要がある時間枠(バッチウィンドウ)が厳密でエラーとなったデータ以降の復旧が必要な場合はChunk
モデルを使用するとよいでしょう。
Spring Batch のメタデータスキーマ⚓︎
Spring Batch では、バッチの実行履歴や実行状態をデータベースに保存するため、 Spring Batch で規定しているメタデータテーブルを作成する必要があります。 作成されるメタデータテーブルの詳細については、Spring Batch ドキュメントのメタデータスキーマ をご覧ください。