バッチアプリケーションのアーキテクチャ⚓︎
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 ドキュメントのメタデータスキーマ をご覧ください。