© 2020 NTT DATA Corporation
今こそ知りたいSpring Batch
2020/12/17
株式会社NTTデータ 公共・社会基盤事業推進部
橋本 直樹
© 2020 NTT DATA Corporation 2
0.はじめに -自己紹介-
橋本 直樹(Naoki Hashimoto)
株式会社NTTデータ
公共・社会基盤事業推進部 プロジェクト推進統括部 技術戦略担当
シニア・エキスパート
• 開発経験
• 主に、Spring Framework(TERASOLUNA Framework)を用いたWebアプリケーション
開発
• OAuth2.0の仕様に沿った、API認可アプリケーション開発
• Spring Security OAuth(現在は、SpringSecurity5に統合)で実装
• 最近の開発
• AWS上のコンテナ環境で動作するSpring Batchアプリケーション開発
© 2020 NTT DATA Corporation 3
0.はじめに -想定聴講者-
• これから、バッチアプリケーションを開発しなければならないが、そもそもバッチっ
てなに?
• Spring FrameworkでWebアプリを作ったことはあるけど、Spring Batch
はつかったことがない・・・
※サンプルコードはSpring Boot前提となります
• Spring Batchのことは知ってるけど、アーキテクチャとかよくわからないし、使い
方もよくわからない・・・
© 2020 NTT DATA Corporation 4
アジェンダ
1. バッチ処理とは?
2. Spring Batchとは?
3. Spring Batchのアーキテクチャ
【基本編】
– ジョブの構成(Job、Step)
– ビジネスロジックの実装(Tasklet、Chunk)
– ジョブの起動
– ジョブ実行管理
【応用編】
– ジョブの再実行方式(リラン、リスタート)
– フロー制御
– 並列処理
– 多重処理
4. クラウド環境でのSpring Batch (SpringBatchのアーキテクチャ 【番外編】)
5. さいごに
© 2020 NTT DATA Corporation
バッチ処理とは?
Spring Batchとは?
© 2020 NTT DATA Corporation 6
1.バッチ処理とは? ~バッチ処理の定義~
• データ処理におけるバッチ処理は、ひとまとまりのデータを一括して処理する
方式である
• 逐次生み出されるデータを一定期間・一定量集めたものをバッチといい、この
バッチ単位で処理をおこなう方式がバッチ処理である
※バッチ処理, Wikipedia, https://tinyurl.com/y43v4ulr, (参照2020-11-25)
© 2020 NTT DATA Corporation 7
1.バッチ処理とは? ~バッチ処理パターン~
• パターン1
あらかじめ登録した一連の処理を自動的に実行する処理方式(※処理
量は大小様々)
• スケジュール起動
• イベント起動(ファイル格納等)
• オンラインディレード(REST API起動)
企業等の業務システムではこちらのパターンであることが多い
• パターン2
 大量データに対する処理といった重い処理を、一括して実施する
 大規模シミュレーターやAIの機械学習等
© 2020 NTT DATA Corporation 8
2.Spring Batchとは?
• Spring Frameworkをベースとした、バッチアプリケーションを開発するためのアプリケーショ
ンフレームワーク
• 以下の機能を提供
 処理の流れを定型化(tasklet、chunk)
 様々なジョブ起動方式(コマンドライン、キュー等)
 様々なデータ形式への入出力(ファイル、データべース等)
 ジョブの実行管理(実行状態管理、ジョブの再実行等)
 処理の効率化(多重実行、並列実行等)
※Spring Batchのアーキテクチャ, TERASOLUNA Batch Framework for Java (5.x) Development Guideline,https://tinyurl.com/y5x477hg, (参照2020-11-25)
© 2020 NTT DATA Corporation
Spring Batchのアーキテクチャ
【基本編】
© 2020 NTT DATA Corporation 10
3.Spring Batchのアーキテクチャ -ジョブの構成-
Job1
Step1 Step2 StepN
・・・
JobRepository
・・・
JobN
JobLauncher(or JobOperator)
© 2020 NTT DATA Corporation 11
3.Spring Batchのアーキテクチャ -ジョブの構成-
Job1
Step1 Step2 StepN
・・・
JobRepository
・・・
JobN
JobLauncher(or JobOperator) Jobを起動
© 2020 NTT DATA Corporation 12
3.Spring Batchのアーキテクチャ -ジョブの構成-
Job1
Step1 Step2 StepN
・・・
JobRepository
・・・
JobN
JobLauncher(or JobOperator) SpringBatchが
バッチ処理を行う単位
© 2020 NTT DATA Corporation 13
3.Spring Batchのアーキテクチャ -ジョブの構成-
Job1
Step1 Step2 StepN
・・・
JobRepository
・・・
JobN
JobLauncher(or JobOperator) Jobは複数のStepで構成され、
Stepでデータへの処理を行う
© 2020 NTT DATA Corporation 14
3.Spring Batchのアーキテクチャ -ジョブの構成-
Job1
Step1 Step2 StepN
・・・
JobRepository
・・・
JobN
JobLauncher(or JobOperator) JobRepositoryでJob、Stepの
実行状態を管理する
© 2020 NTT DATA Corporation 15
3.Spring Batchのアーキテクチャ -ビジネスロジック実装-
Chunk
• 3つのインターフェースで構成されており、データを読み込み、業務処理、書きこみを実施
• フラットファイル(CSV等)、XMLファイル、JSONファイル、DBアクセスを扱うのを容
易にするために、サポートクラスも用意されている
• 処理対象となるデータを1件ずつ処理するのではなく、一定件数のチャンクを単位とする
• トランザクションは、チャンク単位の中間コミット方式となる
Step
ItemReader ItemProcessor ItemWriter
Data
Chunk Chunk
Item
Item
Item
Item
© 2020 NTT DATA Corporation 16
3.Spring Batchのアーキテクチャ -ビジネスロジック実装-
Tasklet
• executeという1つのメソッドをもつ単純なインターフェースで、Chunkに比べて実装も容易
• Chunkモデルに当てはまらないような処理(入力データに関係のない処理)や、順序性
の担保が必要な処理(コントロールブレイク処理等)に向いている
• トランザクションは、Tasklet処理単位の一括コミット方式となる
• TaskletからServiceクラスなどを呼び出す際は、そのトランザクション属性に注意
• Serviceを別トランザクションとする場合は、Transactionalアノテーションのpropagation属性を
REQUIRES_NEWとする等
Step
Tasklet
© 2020 NTT DATA Corporation 17
3.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-
@Configuration
@EnableBatchProcessing
public class JobConfig extends DefaultBatchConfigurer {
//omitted
@Bean
public Step step01() {
return stepBuilderFactory.get(“step01”).tasklet(tasklet()).build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get(“job”)
.incrementer(new RunIdIncrementer())
.listener(listener())
.start(step01()).build();
}
//omitted
}
Job,Stepのサンプル(Configクラス)※Taskletの場合
Step01を実行するJob
Tasklet01を実行する
Step
SpringBatchを有効にする
© 2020 NTT DATA Corporation 18
3.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-
Job,Stepのサンプル(Configクラス)※Chunkの場合
@Bean
public Step step02() {
return stepBuilderFactory.get("step02")
.<String, String> chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get(“job”)
.incrementer(new RunIdIncrementer())
.listener(listener())
.start(step02()).build();
}
1つのchunkで扱う
アイテム数
© 2020 NTT DATA Corporation 19
3.Spring Batchのアーキテクチャ -ジョブの起動-
• 実行時にジョブを順次起動
• デフォルトでは、Bean定義されたジョブが順次起動される
• application.yml等でspring.batch.job.enabled = false とすると無効
• Javaコマンド引数により起動
• ShellScriptなどで、ComandLineJobRunnerを経由して起動する
• 引数として、ジョブ起動設定ファイルパスやJobIDを設定する
• キュー、DB等をポーリングして非同期実行
• 監視処理を作成し、キューやDBを監視(SpringBatchは監視処理をもっていない)
• 監視処理から、JobOperator経由で起動する
© 2020 NTT DATA Corporation 20
3.Spring Batchのアーキテクチャ -ジョブの起動-
Listener
• JobやStepの実行前後やエラー発生時に処理を挿入するためのインターフェース
• Listenerないで、開始終了ログの出力を行ったりする
• 様々なListenerインターフェースがあるが、以下が一般的
• JobExecutionListener
• StepExecutionListener
• ChunkListener
• ItemReadListener、ItemProcessListener、ItemWriteListener
© 2020 NTT DATA Corporation 21
3.Spring Batchのアーキテクチャ -ジョブの起動-
public class JobListener extends JobExecutionListenerSupport {
@Override
public void beforeJob(JobExecution jobExecution) {
super.beforeJob(jobExecution);
System.out.println("Start JOB");
}
@Override
public void afterJob(JobExecution jobExecution) {
super.afterJob(jobExecution);
System.out.println("End JOB");
}
}
Listenerのサンプルコード
Job実行後に
呼び出される
Job実行前に
呼び出される
© 2020 NTT DATA Corporation 22
3.Spring Batchのアーキテクチャ -ジョブ実行管理-
• JobInstance :ジョブを管理する論理的な単位
• ジョブ名(ジョブID)+ジョブパラメータのセットを一意に管理
• 同一キー情報のJobInstanceは生成されない(実行エラーとなる)
• ジョブは二重実行されない
• JobExecution :ジョブを管理する物理的な実行単位
• 失敗したジョブに対して再実行すると、新しいJobExecutionが作成される
• StepExecution:ステップを管理する物理的な実行単位
JobInstance
JobExecution
StepExecution
*
*
1
1
© 2020 NTT DATA Corporation 23
3.Spring Batchのアーキテクチャ -ジョブ実行管理-
JobRepositoryのメタデータスキーマ
• ジョブ実行管理はDB等で実施
• デフォルトではインメモリで管理
• 永続化が必要な場合は、自身でDBと
スキーマを用意する必要あり
※付録A:メタデータスキーマ, Spring Batch(Ver.4.3.0) - リファレンスドキュメント, https://tinyurl.com/y6cmdrrd, (参照2020-11-25)
© 2020 NTT DATA Corporation 24
3.Spring Batchのアーキテクチャ -ジョブ実行管理-
ジョブの実行ステータス
ステータス 説明 リスタート可否
COMPLETED 実行成功 ×
FAILED 実行失敗 ○
STARTED 実行中 ×
STARTING 開始前 ×
STOPPING 停止待ち ×
STOPPED 停止 ○
ABANDANED 失敗したが処理完了、再起動時スキップ ×
UNKNOWN 状態不明 ×
※BatchStatus, Spring Batch(Ver.4.3.0) - APIドキュメント, https://spring.pleiades.io/spring-batch/docs/4.3.x/api/, (参照2020-11-25)
© 2020 NTT DATA Corporation
Spring Batchのアーキテクチャ
【応用編】
© 2020 NTT DATA Corporation 26
3.Spring Batchのアーキテクチャ -ジョブの再実行方式-
再実行方式には大きく分けて、リラン、リスタートの2種類がある
• リラン
• ジョブを最初からやり直す方式
• Taskletモデルが適している
• リスタート
• ジョブが中断したところから処理を再開する方式
• 正常に処理できていたものをスキップし、未処理のものから処理を再開
• Chunkモデルが適している
© 2020 NTT DATA Corporation 27
3.Spring Batchのアーキテクチャ -ジョブの再実行方式-
リラン
• リラン時、まったく同一の「ジョブ名(ジョブID)+ジョブパラメータ」では起動できない
• 二重実行防止機能が働くため、ジョブパラメータを変更しリランする
• 業務データの初期化等が必要(業務処理のべきとう性を担保することが望ましい)
JobInstance1
JobExecution1-1
リラン JobInstance2
JobExecution2-1
© 2020 NTT DATA Corporation 28
3.Spring Batchのアーキテクチャ -ジョブの再実行方式-
リスタート
• 処理再開位置を保持、取得し、再開位置までのデータスキップが必要
• Chunkモデルを適用することで、比較的実現しやすい(中間コミットモデル)
• 失敗したジョブのJobExecutionIDに対して「-restart」と指定することでリスタート可能
• JobLauncherやJobOperatorから指定可能
JobInstance1
JobExecution1-1
リスタート
JobExecution1-2
ジョブパラメータは、
JobRepositoryから復元
© 2020 NTT DATA Corporation 29
Job1
3.Spring Batchのアーキテクチャ -フロー制御-
Step1
Step2
Step3
シーケンシャルフロー
• 全てのStepが順番に実行されるジョブ
© 2020 NTT DATA Corporation 30
Job1
3.Spring Batchのアーキテクチャ -フロー制御-
シーケンシャルフロー
• 全てのStepが順番に実行されるジョブ
• Step中の処理が異常終了した場合は、後続ステップを実行されない
• Step2が失敗した場合、Step3は実行されない
Step1
Step2
Step3
実行されない
© 2020 NTT DATA Corporation 31
Job1
3.Spring Batchのアーキテクチャ -フロー制御-
シーケンシャルフロー
• 全てのStepが順番に実行されるジョブ
• Step中の処理が異常終了した場合は、後続ステップを実行されない
• Step2が失敗した場合、Step3は実行されない
• 異常終了の原因を取り除き、ジョブをリスタートした場合、異常終了し
たStepから処理をやり直すことが可能
• Job1をリスタートした場合、Step2からリスタート
Step1
Step2
Step3
正常終了Stepは
実行されない
リスタート
© 2020 NTT DATA Corporation 32
3.Spring Batchのアーキテクチャ -フロー制御-
Jobのサンプル(シーケンシャルフロー)
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.listener(listener())
.start(step01())
.next(step02())
.next(step03())
.build();
}
startで最初のStepを指定し、nextで次のStepをつなげていく
Step1
Step2
Step3
© 2020 NTT DATA Corporation 33
3.Spring Batchのアーキテクチャ -フロー制御-
条件分岐
• Stepの実行結果(ExitStatus)によって、後続の
Stepを変更する
• 実行結果がFAILED以外の状態で、ジョブが終了して
しまった場合、リスタートできなくなることがある
Job1
Step1
Step3 Step2
成功
したか?
Yes
No
© 2020 NTT DATA Corporation 34
3.Spring Batchのアーキテクチャ -フロー制御-
Jobのサンプル(条件分岐)
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.listener(listener())
.start(step01())
.on("*").to(step03())
.from(step01()).on("FAILED").to(step02())
.end()
.build();
}
Step1
Step3 Step2
成功
したか?
Yes
No
onで実行結果の文字列判定句を設定し、
toで一致した場合のstepを指定
※「*」はゼロ個以上の文字に一致する
© 2020 NTT DATA Corporation 35
3.Spring Batchのアーキテクチャ -並列処理-
マルチスレッドステップ
• 単一プロセス上で、Step(チャンク)単位でスレッドを作成
• マルチスレッド化される際は、順序性が担保されないので、アイテムの処理に順序性が必
要な場合は、本ステップは採用できない
並行ステップ
• 単一プロセス上で、スプリットフロー(複数のStepの連なり)単位でスレッドを作成
© 2020 NTT DATA Corporation 36
3.Spring Batchのアーキテクチャ -並列処理-
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Step step02() {
return stepBuilderFactory.get("step02")
.<String, String> chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.throttleLimit(10)
.build();
}
Stepのサンプル(マルチスレッドステップ)
Chunkごとに、新しい
スレッドを作成する
スレッド数はデフォルトでは最大
4つまでしか生成できないので、
最大値を増やす場合に設定
© 2020 NTT DATA Corporation 37
3.Spring Batchのアーキテクチャ -並列処理-
Flowのサンプル(並行ステップ)
@Bean
public Flow flow1() {
return new FlowBuilder<SimpleFlow>("flow1")
.start(step01())
.next(step02())
.build();
}
@Bean
public Flow flow2() {
return new FlowBuilder<SimpleFlow>("flow2")
.start(step03())
.build();
}
step01→step02というStepの
連なりを1つのFlowとする
step03の実行を1つのFlowとする
Flow1
Step1
Step2
Flow2
Step3
© 2020 NTT DATA Corporation 38
3.Spring Batchのアーキテクチャ -並列処理-
Jobのサンプル(並行ステップ)
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(splitFlow())
.next(step04())
.build()
.build();
}
@Bean
public Flow splitFlow() {
return new FlowBuilder<SimpleFlow>("splitFlow")
.split(taskExecutor())
.add(flow1(), flow2())
.build();
}
Flow1
Step1
Step2
Flow2
Step3
Step4
Flow1、Flow2を別スレッドで並走させる
Flow1+Flow2の並走完了後、Step04を実行
© 2020 NTT DATA Corporation 39
3.Spring Batchのアーキテクチャ -多重処理-
パーティショニング
• Stepの実行を分割してマルチスレッドで実行する
• Manager内の処理を特定の件数ごとに、自動的に分割しWorkerを作成する
• 全てのWorkerの処理が完了したら、ManagerのStepを完了とする
Job1
Step1
Step2(Manager)
Step3
Worker
Worker
Worker
Worker
Worker
© 2020 NTT DATA Corporation 40
3.Spring Batchのアーキテクチャ -多重処理-
@Bean
public Step stepManager() {
return stepBuilderFactory
.get("step2.manager")
.partitioner(step02())
.partitioner("step2", partitioner())
.gridSize(10)
.taskExecutor(taskExecutor())
.build();
}
@Bean
public Partitioner partitioner() {
return new Partitioner01();
}
Stepのサンプル(Manegerステップ)
Step02をパーティション化
パーティショナーを追加
パーティションの分割数を設定
© 2020 NTT DATA Corporation 41
3.Spring Batchのアーキテクチャ -多重処理-
public class Partitioner01 implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> map = new HashMap<>();
int maxSize = 1000; // 実際は対象itemの件数を設定
int dataSize = maxSize / gridSize; // 1つのWorkerで扱うデータサイズ
int offset = 0; // 初期位置からのオフセット
for (int i = 0; i < gridSize; i++ ) {
ExecutionContext context = new ExecutionContext();
context.putInt("dataSize", dataSize);
context.putInt("offset", offset);
offset += dataSize;
map.put("partition:" + i, context);
}
return map;
}
}
Partitionerのサンプル Partitonerインターフェースを実装
スレッドを識別する文字列と、スレッドに引き
渡したいパラメータ(ExecutionContext)
をセットでMapに設定して返却
実際にItemReaderなどで
実施する処理に合わせて
変更する
© 2020 NTT DATA Corporation
クラウド環境でのSpring Batch
※Spring Batchのアーキテクチャ
【番外編】
© 2020 NTT DATA Corporation 43
4.クラウド環境でのSpring Batch -クラウド環境におけるバッチアプリケーション開発-
以下のような理由から、バッチ処理はパブリッククラウドサービスと親和性が高い
① バッチ処理は決まった時間のみ起動すればよく、パブリッククラウドサービスを利用した場合、
コストメリットを得やすい
 インスタンスの種類や起動時間に対して課金されるため
② 大量データを扱う場合、容易にスケールアウト可能であるため、業務量に応じたリソース
設計が実現可能
 余分なリソースを予め用意する必要がなく、コスト削減が狙える
AWSにおける、バッチアーキテクチャに適したマネージドサービスを紹介し、
そのサービスでSpring Batchを利用する際の注意点を紹介する
© 2020 NTT DATA Corporation 44
4.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-
AWS Cloud
Auto Scaling group
VPC
ECS
JobQueue
AWS Batch
JobDefinition
ECR
Cloud Watch Logs
AWS Batchの利用
• AWS Batchの実態は、ECS(コンテナオーケストレーションサービス)と独自のキュー
• ECSをそのまま構築する際に考慮する必要がある、クラスタやサービス等が自動構築されるので構築が容易
• キューにメッセージが送信されると、JobDefinitionに記載された定義の通りコンテナが起動する
• コンテナはキューにメッセージが登録されてから起動するため、起動時間のバッファを考慮する必要あり
・・・ ・・・
コンテナイメージ
メッセージ登録 ログ出力
© 2020 NTT DATA Corporation 45
4.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-
ECS + SQSの利用
• 性能要件が厳しく、AWS Batchの起動時間が無視できない場合はECS + SQSの構成で対応
• AWS Batchの起動時間はコンテナイメージのつくりにより異なる
• ECS上でコンテナを常時起動することで、起動コストが発生しないようにする(維持コストは上がる)
• JobQueueの代わりにSQSを利用
• それぞれ個別に構築する必要があるので、構築コストは上がる
AWS Cloud
VPC
SQS
ECS
バッチAP1 バッチAP2 バッチAP3
・・・
キュー1 キュー2
・・・
メッセージ登録
© 2020 NTT DATA Corporation 46
4.クラウド環境でのSpring Batch -アプリケーションのコンテナ化-
• 紹介したマネージドサービスは、全てコンテナアプリケーションを前提としている
• Spring Batchで作成したアプリケーションのDocker Imageを作成し、ECR(AWSの
提供するDockerHubサービス)にpushする必要がある
 Dockerfileを作成しDocker Imageを用意する
FROM amazoncorretto:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar","-Dfile.encoding=UTF-8"]
Dockerfileのサンプル AWSの提供するOpenJDK11をベースとする
Maven等で作成したjarファイルをコピー
コンテナ起動時にJavaコ
マンドでSpring Batchアプ
リケーションを起動
© 2020 NTT DATA Corporation 47
4.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-
• 紹介したマネージドサービスは、キューに滞留したメッセージの量によって、コンテナを新たに
起動することによって、スケールアウトを実現可能
• アプリケーションは、コンテナが増えた際にスケールアウト可能な単位でジョブを設計する必
要がある
• 1ジョブで大量のファイルを取り扱う場合、複数のジョブから扱うファイルを重複させな
いようにする制御は難しく、結局、1つのジョブでやり切る必要がある
• 1ジョブ1ファイルといった単位で処理することで、ファイル量が増えればジョブの数を増
やし、ジョブの数が多くなれば(キューに滞留したメッセージ数が多い)コンテナを増
やしてスケールアウトすることが可能
© 2020 NTT DATA Corporation 48
4.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-
Job
1ジョブで大量ファイル
スケールアウト
Job
Job
1ジョブで1ファイル
スケールアウト
Job
1メッセージであたりの
ファイル数も大量になっ
ており、スケールアウト
しても、ファイルを同時
に処理できない
ファイル数が増えれば、
メッセージ数が増え、ス
ケールアウトした先の
ジョブでも同時にファイ
ルの処理が可能
© 2020 NTT DATA Corporation 49
4.クラウド環境でのSpring Batch -ジョブ管理テーブルの作成時の注意点-
• RDS(RDBのマネージドサービス)上で、ジョブ管理テーブルを構築する必要がある
• 前述の通り、コンテナ化したアプリがスケールアウトしていくと、RDSへのアクセス数が増加
し、コネクションプールが枯渇してしまう場合がある
• Spring Batchを利用する場合は、業務アプリケーション上で利用しない場合でもRDS
が必要となるので、性能試験を実施してコネクションプール枯渇やCPU使用率高騰等の
性能問題が発生しなか確認する必要がある
© 2020 NTT DATA Corporation
おわりに
© 2020 NTT DATA Corporation 51
5.おわりに
• バッチ処理ってなに?
• データを一定期間集めて、一括して処理する方式
• Spring Batchのアーキテクチャは?
• Job、Stepで構成されている
• ファイルやDBなどのデータ読み込み、処理、書きこみを実施することを前提としている
• Tasklet、Chunkのモデルがあり、処理内容や再実行方式により選択する
• Spring Batchはどうやって使うの?
• Javaコマンド引数による指定
• キューやDBをポーリングすることによる非同期実行
© 2020 NTT DATA Corporation 52
5.おわりに
参考情報
• Spring Batch - リファレンスドキュメント(バージョン 4.3.0)
• https://spring.pleiades.io/spring-batch/docs/current/reference/html/
• TERASOLUNA Batch Framework for Java (5.x) Development Guideline(バージョン5.3.0)
• https://terasoluna-batch.github.io/guideline/current/ja/single_index.html
• Amazon SQSを使ったSpringアプリケーション(3)(4), IT Search+
• https://news.mynavi.jp/itsearch/article/devsoft/4713
• https://news.mynavi.jp/itsearch/article/devsoft/4756
• [AWS Black Belt Online Seminar] AWS Batch
• https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-batch-2019/
© 2020 NTT DATA Corporation
ご静聴ありがとうございました
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)

  • 1.
    © 2020 NTTDATA Corporation 今こそ知りたいSpring Batch 2020/12/17 株式会社NTTデータ 公共・社会基盤事業推進部 橋本 直樹
  • 2.
    © 2020 NTTDATA Corporation 2 0.はじめに -自己紹介- 橋本 直樹(Naoki Hashimoto) 株式会社NTTデータ 公共・社会基盤事業推進部 プロジェクト推進統括部 技術戦略担当 シニア・エキスパート • 開発経験 • 主に、Spring Framework(TERASOLUNA Framework)を用いたWebアプリケーション 開発 • OAuth2.0の仕様に沿った、API認可アプリケーション開発 • Spring Security OAuth(現在は、SpringSecurity5に統合)で実装 • 最近の開発 • AWS上のコンテナ環境で動作するSpring Batchアプリケーション開発
  • 3.
    © 2020 NTTDATA Corporation 3 0.はじめに -想定聴講者- • これから、バッチアプリケーションを開発しなければならないが、そもそもバッチっ てなに? • Spring FrameworkでWebアプリを作ったことはあるけど、Spring Batch はつかったことがない・・・ ※サンプルコードはSpring Boot前提となります • Spring Batchのことは知ってるけど、アーキテクチャとかよくわからないし、使い 方もよくわからない・・・
  • 4.
    © 2020 NTTDATA Corporation 4 アジェンダ 1. バッチ処理とは? 2. Spring Batchとは? 3. Spring Batchのアーキテクチャ 【基本編】 – ジョブの構成(Job、Step) – ビジネスロジックの実装(Tasklet、Chunk) – ジョブの起動 – ジョブ実行管理 【応用編】 – ジョブの再実行方式(リラン、リスタート) – フロー制御 – 並列処理 – 多重処理 4. クラウド環境でのSpring Batch (SpringBatchのアーキテクチャ 【番外編】) 5. さいごに
  • 5.
    © 2020 NTTDATA Corporation バッチ処理とは? Spring Batchとは?
  • 6.
    © 2020 NTTDATA Corporation 6 1.バッチ処理とは? ~バッチ処理の定義~ • データ処理におけるバッチ処理は、ひとまとまりのデータを一括して処理する 方式である • 逐次生み出されるデータを一定期間・一定量集めたものをバッチといい、この バッチ単位で処理をおこなう方式がバッチ処理である ※バッチ処理, Wikipedia, https://tinyurl.com/y43v4ulr, (参照2020-11-25)
  • 7.
    © 2020 NTTDATA Corporation 7 1.バッチ処理とは? ~バッチ処理パターン~ • パターン1 あらかじめ登録した一連の処理を自動的に実行する処理方式(※処理 量は大小様々) • スケジュール起動 • イベント起動(ファイル格納等) • オンラインディレード(REST API起動) 企業等の業務システムではこちらのパターンであることが多い • パターン2  大量データに対する処理といった重い処理を、一括して実施する  大規模シミュレーターやAIの機械学習等
  • 8.
    © 2020 NTTDATA Corporation 8 2.Spring Batchとは? • Spring Frameworkをベースとした、バッチアプリケーションを開発するためのアプリケーショ ンフレームワーク • 以下の機能を提供  処理の流れを定型化(tasklet、chunk)  様々なジョブ起動方式(コマンドライン、キュー等)  様々なデータ形式への入出力(ファイル、データべース等)  ジョブの実行管理(実行状態管理、ジョブの再実行等)  処理の効率化(多重実行、並列実行等) ※Spring Batchのアーキテクチャ, TERASOLUNA Batch Framework for Java (5.x) Development Guideline,https://tinyurl.com/y5x477hg, (参照2020-11-25)
  • 9.
    © 2020 NTTDATA Corporation Spring Batchのアーキテクチャ 【基本編】
  • 10.
    © 2020 NTTDATA Corporation 10 3.Spring Batchのアーキテクチャ -ジョブの構成- Job1 Step1 Step2 StepN ・・・ JobRepository ・・・ JobN JobLauncher(or JobOperator)
  • 11.
    © 2020 NTTDATA Corporation 11 3.Spring Batchのアーキテクチャ -ジョブの構成- Job1 Step1 Step2 StepN ・・・ JobRepository ・・・ JobN JobLauncher(or JobOperator) Jobを起動
  • 12.
    © 2020 NTTDATA Corporation 12 3.Spring Batchのアーキテクチャ -ジョブの構成- Job1 Step1 Step2 StepN ・・・ JobRepository ・・・ JobN JobLauncher(or JobOperator) SpringBatchが バッチ処理を行う単位
  • 13.
    © 2020 NTTDATA Corporation 13 3.Spring Batchのアーキテクチャ -ジョブの構成- Job1 Step1 Step2 StepN ・・・ JobRepository ・・・ JobN JobLauncher(or JobOperator) Jobは複数のStepで構成され、 Stepでデータへの処理を行う
  • 14.
    © 2020 NTTDATA Corporation 14 3.Spring Batchのアーキテクチャ -ジョブの構成- Job1 Step1 Step2 StepN ・・・ JobRepository ・・・ JobN JobLauncher(or JobOperator) JobRepositoryでJob、Stepの 実行状態を管理する
  • 15.
    © 2020 NTTDATA Corporation 15 3.Spring Batchのアーキテクチャ -ビジネスロジック実装- Chunk • 3つのインターフェースで構成されており、データを読み込み、業務処理、書きこみを実施 • フラットファイル(CSV等)、XMLファイル、JSONファイル、DBアクセスを扱うのを容 易にするために、サポートクラスも用意されている • 処理対象となるデータを1件ずつ処理するのではなく、一定件数のチャンクを単位とする • トランザクションは、チャンク単位の中間コミット方式となる Step ItemReader ItemProcessor ItemWriter Data Chunk Chunk Item Item Item Item
  • 16.
    © 2020 NTTDATA Corporation 16 3.Spring Batchのアーキテクチャ -ビジネスロジック実装- Tasklet • executeという1つのメソッドをもつ単純なインターフェースで、Chunkに比べて実装も容易 • Chunkモデルに当てはまらないような処理(入力データに関係のない処理)や、順序性 の担保が必要な処理(コントロールブレイク処理等)に向いている • トランザクションは、Tasklet処理単位の一括コミット方式となる • TaskletからServiceクラスなどを呼び出す際は、そのトランザクション属性に注意 • Serviceを別トランザクションとする場合は、Transactionalアノテーションのpropagation属性を REQUIRES_NEWとする等 Step Tasklet
  • 17.
    © 2020 NTTDATA Corporation 17 3.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装- @Configuration @EnableBatchProcessing public class JobConfig extends DefaultBatchConfigurer { //omitted @Bean public Step step01() { return stepBuilderFactory.get(“step01”).tasklet(tasklet()).build(); } @Bean public Job job() throws Exception { return jobBuilderFactory.get(“job”) .incrementer(new RunIdIncrementer()) .listener(listener()) .start(step01()).build(); } //omitted } Job,Stepのサンプル(Configクラス)※Taskletの場合 Step01を実行するJob Tasklet01を実行する Step SpringBatchを有効にする
  • 18.
    © 2020 NTTDATA Corporation 18 3.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装- Job,Stepのサンプル(Configクラス)※Chunkの場合 @Bean public Step step02() { return stepBuilderFactory.get("step02") .<String, String> chunk(10) .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter()) .build(); } @Bean public Job job() throws Exception { return jobBuilderFactory.get(“job”) .incrementer(new RunIdIncrementer()) .listener(listener()) .start(step02()).build(); } 1つのchunkで扱う アイテム数
  • 19.
    © 2020 NTTDATA Corporation 19 3.Spring Batchのアーキテクチャ -ジョブの起動- • 実行時にジョブを順次起動 • デフォルトでは、Bean定義されたジョブが順次起動される • application.yml等でspring.batch.job.enabled = false とすると無効 • Javaコマンド引数により起動 • ShellScriptなどで、ComandLineJobRunnerを経由して起動する • 引数として、ジョブ起動設定ファイルパスやJobIDを設定する • キュー、DB等をポーリングして非同期実行 • 監視処理を作成し、キューやDBを監視(SpringBatchは監視処理をもっていない) • 監視処理から、JobOperator経由で起動する
  • 20.
    © 2020 NTTDATA Corporation 20 3.Spring Batchのアーキテクチャ -ジョブの起動- Listener • JobやStepの実行前後やエラー発生時に処理を挿入するためのインターフェース • Listenerないで、開始終了ログの出力を行ったりする • 様々なListenerインターフェースがあるが、以下が一般的 • JobExecutionListener • StepExecutionListener • ChunkListener • ItemReadListener、ItemProcessListener、ItemWriteListener
  • 21.
    © 2020 NTTDATA Corporation 21 3.Spring Batchのアーキテクチャ -ジョブの起動- public class JobListener extends JobExecutionListenerSupport { @Override public void beforeJob(JobExecution jobExecution) { super.beforeJob(jobExecution); System.out.println("Start JOB"); } @Override public void afterJob(JobExecution jobExecution) { super.afterJob(jobExecution); System.out.println("End JOB"); } } Listenerのサンプルコード Job実行後に 呼び出される Job実行前に 呼び出される
  • 22.
    © 2020 NTTDATA Corporation 22 3.Spring Batchのアーキテクチャ -ジョブ実行管理- • JobInstance :ジョブを管理する論理的な単位 • ジョブ名(ジョブID)+ジョブパラメータのセットを一意に管理 • 同一キー情報のJobInstanceは生成されない(実行エラーとなる) • ジョブは二重実行されない • JobExecution :ジョブを管理する物理的な実行単位 • 失敗したジョブに対して再実行すると、新しいJobExecutionが作成される • StepExecution:ステップを管理する物理的な実行単位 JobInstance JobExecution StepExecution * * 1 1
  • 23.
    © 2020 NTTDATA Corporation 23 3.Spring Batchのアーキテクチャ -ジョブ実行管理- JobRepositoryのメタデータスキーマ • ジョブ実行管理はDB等で実施 • デフォルトではインメモリで管理 • 永続化が必要な場合は、自身でDBと スキーマを用意する必要あり ※付録A:メタデータスキーマ, Spring Batch(Ver.4.3.0) - リファレンスドキュメント, https://tinyurl.com/y6cmdrrd, (参照2020-11-25)
  • 24.
    © 2020 NTTDATA Corporation 24 3.Spring Batchのアーキテクチャ -ジョブ実行管理- ジョブの実行ステータス ステータス 説明 リスタート可否 COMPLETED 実行成功 × FAILED 実行失敗 ○ STARTED 実行中 × STARTING 開始前 × STOPPING 停止待ち × STOPPED 停止 ○ ABANDANED 失敗したが処理完了、再起動時スキップ × UNKNOWN 状態不明 × ※BatchStatus, Spring Batch(Ver.4.3.0) - APIドキュメント, https://spring.pleiades.io/spring-batch/docs/4.3.x/api/, (参照2020-11-25)
  • 25.
    © 2020 NTTDATA Corporation Spring Batchのアーキテクチャ 【応用編】
  • 26.
    © 2020 NTTDATA Corporation 26 3.Spring Batchのアーキテクチャ -ジョブの再実行方式- 再実行方式には大きく分けて、リラン、リスタートの2種類がある • リラン • ジョブを最初からやり直す方式 • Taskletモデルが適している • リスタート • ジョブが中断したところから処理を再開する方式 • 正常に処理できていたものをスキップし、未処理のものから処理を再開 • Chunkモデルが適している
  • 27.
    © 2020 NTTDATA Corporation 27 3.Spring Batchのアーキテクチャ -ジョブの再実行方式- リラン • リラン時、まったく同一の「ジョブ名(ジョブID)+ジョブパラメータ」では起動できない • 二重実行防止機能が働くため、ジョブパラメータを変更しリランする • 業務データの初期化等が必要(業務処理のべきとう性を担保することが望ましい) JobInstance1 JobExecution1-1 リラン JobInstance2 JobExecution2-1
  • 28.
    © 2020 NTTDATA Corporation 28 3.Spring Batchのアーキテクチャ -ジョブの再実行方式- リスタート • 処理再開位置を保持、取得し、再開位置までのデータスキップが必要 • Chunkモデルを適用することで、比較的実現しやすい(中間コミットモデル) • 失敗したジョブのJobExecutionIDに対して「-restart」と指定することでリスタート可能 • JobLauncherやJobOperatorから指定可能 JobInstance1 JobExecution1-1 リスタート JobExecution1-2 ジョブパラメータは、 JobRepositoryから復元
  • 29.
    © 2020 NTTDATA Corporation 29 Job1 3.Spring Batchのアーキテクチャ -フロー制御- Step1 Step2 Step3 シーケンシャルフロー • 全てのStepが順番に実行されるジョブ
  • 30.
    © 2020 NTTDATA Corporation 30 Job1 3.Spring Batchのアーキテクチャ -フロー制御- シーケンシャルフロー • 全てのStepが順番に実行されるジョブ • Step中の処理が異常終了した場合は、後続ステップを実行されない • Step2が失敗した場合、Step3は実行されない Step1 Step2 Step3 実行されない
  • 31.
    © 2020 NTTDATA Corporation 31 Job1 3.Spring Batchのアーキテクチャ -フロー制御- シーケンシャルフロー • 全てのStepが順番に実行されるジョブ • Step中の処理が異常終了した場合は、後続ステップを実行されない • Step2が失敗した場合、Step3は実行されない • 異常終了の原因を取り除き、ジョブをリスタートした場合、異常終了し たStepから処理をやり直すことが可能 • Job1をリスタートした場合、Step2からリスタート Step1 Step2 Step3 正常終了Stepは 実行されない リスタート
  • 32.
    © 2020 NTTDATA Corporation 32 3.Spring Batchのアーキテクチャ -フロー制御- Jobのサンプル(シーケンシャルフロー) @Bean public Job job() throws Exception { return jobBuilderFactory.get("job") .incrementer(new RunIdIncrementer()) .listener(listener()) .start(step01()) .next(step02()) .next(step03()) .build(); } startで最初のStepを指定し、nextで次のStepをつなげていく Step1 Step2 Step3
  • 33.
    © 2020 NTTDATA Corporation 33 3.Spring Batchのアーキテクチャ -フロー制御- 条件分岐 • Stepの実行結果(ExitStatus)によって、後続の Stepを変更する • 実行結果がFAILED以外の状態で、ジョブが終了して しまった場合、リスタートできなくなることがある Job1 Step1 Step3 Step2 成功 したか? Yes No
  • 34.
    © 2020 NTTDATA Corporation 34 3.Spring Batchのアーキテクチャ -フロー制御- Jobのサンプル(条件分岐) @Bean public Job job() throws Exception { return jobBuilderFactory.get("job") .incrementer(new RunIdIncrementer()) .listener(listener()) .start(step01()) .on("*").to(step03()) .from(step01()).on("FAILED").to(step02()) .end() .build(); } Step1 Step3 Step2 成功 したか? Yes No onで実行結果の文字列判定句を設定し、 toで一致した場合のstepを指定 ※「*」はゼロ個以上の文字に一致する
  • 35.
    © 2020 NTTDATA Corporation 35 3.Spring Batchのアーキテクチャ -並列処理- マルチスレッドステップ • 単一プロセス上で、Step(チャンク)単位でスレッドを作成 • マルチスレッド化される際は、順序性が担保されないので、アイテムの処理に順序性が必 要な場合は、本ステップは採用できない 並行ステップ • 単一プロセス上で、スプリットフロー(複数のStepの連なり)単位でスレッドを作成
  • 36.
    © 2020 NTTDATA Corporation 36 3.Spring Batchのアーキテクチャ -並列処理- @Bean public TaskExecutor taskExecutor() { return new SimpleAsyncTaskExecutor("spring_batch"); } @Bean public Step step02() { return stepBuilderFactory.get("step02") .<String, String> chunk(10) .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter()) .taskExecutor(taskExecutor) .throttleLimit(10) .build(); } Stepのサンプル(マルチスレッドステップ) Chunkごとに、新しい スレッドを作成する スレッド数はデフォルトでは最大 4つまでしか生成できないので、 最大値を増やす場合に設定
  • 37.
    © 2020 NTTDATA Corporation 37 3.Spring Batchのアーキテクチャ -並列処理- Flowのサンプル(並行ステップ) @Bean public Flow flow1() { return new FlowBuilder<SimpleFlow>("flow1") .start(step01()) .next(step02()) .build(); } @Bean public Flow flow2() { return new FlowBuilder<SimpleFlow>("flow2") .start(step03()) .build(); } step01→step02というStepの 連なりを1つのFlowとする step03の実行を1つのFlowとする Flow1 Step1 Step2 Flow2 Step3
  • 38.
    © 2020 NTTDATA Corporation 38 3.Spring Batchのアーキテクチャ -並列処理- Jobのサンプル(並行ステップ) @Bean public Job job() { return jobBuilderFactory.get("job") .start(splitFlow()) .next(step04()) .build() .build(); } @Bean public Flow splitFlow() { return new FlowBuilder<SimpleFlow>("splitFlow") .split(taskExecutor()) .add(flow1(), flow2()) .build(); } Flow1 Step1 Step2 Flow2 Step3 Step4 Flow1、Flow2を別スレッドで並走させる Flow1+Flow2の並走完了後、Step04を実行
  • 39.
    © 2020 NTTDATA Corporation 39 3.Spring Batchのアーキテクチャ -多重処理- パーティショニング • Stepの実行を分割してマルチスレッドで実行する • Manager内の処理を特定の件数ごとに、自動的に分割しWorkerを作成する • 全てのWorkerの処理が完了したら、ManagerのStepを完了とする Job1 Step1 Step2(Manager) Step3 Worker Worker Worker Worker Worker
  • 40.
    © 2020 NTTDATA Corporation 40 3.Spring Batchのアーキテクチャ -多重処理- @Bean public Step stepManager() { return stepBuilderFactory .get("step2.manager") .partitioner(step02()) .partitioner("step2", partitioner()) .gridSize(10) .taskExecutor(taskExecutor()) .build(); } @Bean public Partitioner partitioner() { return new Partitioner01(); } Stepのサンプル(Manegerステップ) Step02をパーティション化 パーティショナーを追加 パーティションの分割数を設定
  • 41.
    © 2020 NTTDATA Corporation 41 3.Spring Batchのアーキテクチャ -多重処理- public class Partitioner01 implements Partitioner { @Override public Map<String, ExecutionContext> partition(int gridSize) { Map<String, ExecutionContext> map = new HashMap<>(); int maxSize = 1000; // 実際は対象itemの件数を設定 int dataSize = maxSize / gridSize; // 1つのWorkerで扱うデータサイズ int offset = 0; // 初期位置からのオフセット for (int i = 0; i < gridSize; i++ ) { ExecutionContext context = new ExecutionContext(); context.putInt("dataSize", dataSize); context.putInt("offset", offset); offset += dataSize; map.put("partition:" + i, context); } return map; } } Partitionerのサンプル Partitonerインターフェースを実装 スレッドを識別する文字列と、スレッドに引き 渡したいパラメータ(ExecutionContext) をセットでMapに設定して返却 実際にItemReaderなどで 実施する処理に合わせて 変更する
  • 42.
    © 2020 NTTDATA Corporation クラウド環境でのSpring Batch ※Spring Batchのアーキテクチャ 【番外編】
  • 43.
    © 2020 NTTDATA Corporation 43 4.クラウド環境でのSpring Batch -クラウド環境におけるバッチアプリケーション開発- 以下のような理由から、バッチ処理はパブリッククラウドサービスと親和性が高い ① バッチ処理は決まった時間のみ起動すればよく、パブリッククラウドサービスを利用した場合、 コストメリットを得やすい  インスタンスの種類や起動時間に対して課金されるため ② 大量データを扱う場合、容易にスケールアウト可能であるため、業務量に応じたリソース 設計が実現可能  余分なリソースを予め用意する必要がなく、コスト削減が狙える AWSにおける、バッチアーキテクチャに適したマネージドサービスを紹介し、 そのサービスでSpring Batchを利用する際の注意点を紹介する
  • 44.
    © 2020 NTTDATA Corporation 44 4.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス- AWS Cloud Auto Scaling group VPC ECS JobQueue AWS Batch JobDefinition ECR Cloud Watch Logs AWS Batchの利用 • AWS Batchの実態は、ECS(コンテナオーケストレーションサービス)と独自のキュー • ECSをそのまま構築する際に考慮する必要がある、クラスタやサービス等が自動構築されるので構築が容易 • キューにメッセージが送信されると、JobDefinitionに記載された定義の通りコンテナが起動する • コンテナはキューにメッセージが登録されてから起動するため、起動時間のバッファを考慮する必要あり ・・・ ・・・ コンテナイメージ メッセージ登録 ログ出力
  • 45.
    © 2020 NTTDATA Corporation 45 4.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス- ECS + SQSの利用 • 性能要件が厳しく、AWS Batchの起動時間が無視できない場合はECS + SQSの構成で対応 • AWS Batchの起動時間はコンテナイメージのつくりにより異なる • ECS上でコンテナを常時起動することで、起動コストが発生しないようにする(維持コストは上がる) • JobQueueの代わりにSQSを利用 • それぞれ個別に構築する必要があるので、構築コストは上がる AWS Cloud VPC SQS ECS バッチAP1 バッチAP2 バッチAP3 ・・・ キュー1 キュー2 ・・・ メッセージ登録
  • 46.
    © 2020 NTTDATA Corporation 46 4.クラウド環境でのSpring Batch -アプリケーションのコンテナ化- • 紹介したマネージドサービスは、全てコンテナアプリケーションを前提としている • Spring Batchで作成したアプリケーションのDocker Imageを作成し、ECR(AWSの 提供するDockerHubサービス)にpushする必要がある  Dockerfileを作成しDocker Imageを用意する FROM amazoncorretto:11 ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar","-Dfile.encoding=UTF-8"] Dockerfileのサンプル AWSの提供するOpenJDK11をベースとする Maven等で作成したjarファイルをコピー コンテナ起動時にJavaコ マンドでSpring Batchアプ リケーションを起動
  • 47.
    © 2020 NTTDATA Corporation 47 4.クラウド環境でのSpring Batch -アプリケーションのスケールアウト- • 紹介したマネージドサービスは、キューに滞留したメッセージの量によって、コンテナを新たに 起動することによって、スケールアウトを実現可能 • アプリケーションは、コンテナが増えた際にスケールアウト可能な単位でジョブを設計する必 要がある • 1ジョブで大量のファイルを取り扱う場合、複数のジョブから扱うファイルを重複させな いようにする制御は難しく、結局、1つのジョブでやり切る必要がある • 1ジョブ1ファイルといった単位で処理することで、ファイル量が増えればジョブの数を増 やし、ジョブの数が多くなれば(キューに滞留したメッセージ数が多い)コンテナを増 やしてスケールアウトすることが可能
  • 48.
    © 2020 NTTDATA Corporation 48 4.クラウド環境でのSpring Batch -アプリケーションのスケールアウト- Job 1ジョブで大量ファイル スケールアウト Job Job 1ジョブで1ファイル スケールアウト Job 1メッセージであたりの ファイル数も大量になっ ており、スケールアウト しても、ファイルを同時 に処理できない ファイル数が増えれば、 メッセージ数が増え、ス ケールアウトした先の ジョブでも同時にファイ ルの処理が可能
  • 49.
    © 2020 NTTDATA Corporation 49 4.クラウド環境でのSpring Batch -ジョブ管理テーブルの作成時の注意点- • RDS(RDBのマネージドサービス)上で、ジョブ管理テーブルを構築する必要がある • 前述の通り、コンテナ化したアプリがスケールアウトしていくと、RDSへのアクセス数が増加 し、コネクションプールが枯渇してしまう場合がある • Spring Batchを利用する場合は、業務アプリケーション上で利用しない場合でもRDS が必要となるので、性能試験を実施してコネクションプール枯渇やCPU使用率高騰等の 性能問題が発生しなか確認する必要がある
  • 50.
    © 2020 NTTDATA Corporation おわりに
  • 51.
    © 2020 NTTDATA Corporation 51 5.おわりに • バッチ処理ってなに? • データを一定期間集めて、一括して処理する方式 • Spring Batchのアーキテクチャは? • Job、Stepで構成されている • ファイルやDBなどのデータ読み込み、処理、書きこみを実施することを前提としている • Tasklet、Chunkのモデルがあり、処理内容や再実行方式により選択する • Spring Batchはどうやって使うの? • Javaコマンド引数による指定 • キューやDBをポーリングすることによる非同期実行
  • 52.
    © 2020 NTTDATA Corporation 52 5.おわりに 参考情報 • Spring Batch - リファレンスドキュメント(バージョン 4.3.0) • https://spring.pleiades.io/spring-batch/docs/current/reference/html/ • TERASOLUNA Batch Framework for Java (5.x) Development Guideline(バージョン5.3.0) • https://terasoluna-batch.github.io/guideline/current/ja/single_index.html • Amazon SQSを使ったSpringアプリケーション(3)(4), IT Search+ • https://news.mynavi.jp/itsearch/article/devsoft/4713 • https://news.mynavi.jp/itsearch/article/devsoft/4756 • [AWS Black Belt Online Seminar] AWS Batch • https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-batch-2019/
  • 53.
    © 2020 NTTDATA Corporation ご静聴ありがとうございました 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。