Movatterモバイル変換


[0]ホーム

URL:


11,532 views

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

今こそ知りたいSpring Batch(Spring Fest 2020講演資料)2020年12月17日株式会社NTTデータ公共・社会基盤事業推進部橋本 直樹

Embed presentation

© 2020 NTT DATA Corporation今こそ知りたいSpring Batch2020/12/17株式会社NTTデータ 公共・社会基盤事業推進部橋本 直樹
© 2020 NTT DATA Corporation 20.はじめに -自己紹介-橋本 直樹(Naoki Hashimoto)株式会社NTTデータ公共・社会基盤事業推進部 プロジェクト推進統括部 技術戦略担当シニア・エキスパート• 開発経験• 主に、Spring Framework(TERASOLUNA Framework)を用いたWebアプリケーション開発• OAuth2.0の仕様に沿った、API認可アプリケーション開発• Spring Security OAuth(現在は、SpringSecurity5に統合)で実装• 最近の開発• AWS上のコンテナ環境で動作するSpring Batchアプリケーション開発
© 2020 NTT DATA Corporation 30.はじめに -想定聴講者-• これから、バッチアプリケーションを開発しなければならないが、そもそもバッチってなに?• 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 61.バッチ処理とは? ~バッチ処理の定義~• データ処理におけるバッチ処理は、ひとまとまりのデータを一括して処理する方式である• 逐次生み出されるデータを一定期間・一定量集めたものをバッチといい、このバッチ単位で処理をおこなう方式がバッチ処理である※バッチ処理, Wikipedia, https://tinyurl.com/y43v4ulr, (参照2020-11-25)
© 2020 NTT DATA Corporation 71.バッチ処理とは? ~バッチ処理パターン~• パターン1あらかじめ登録した一連の処理を自動的に実行する処理方式(※処理量は大小様々)• スケジュール起動• イベント起動(ファイル格納等)• オンラインディレード(REST API起動)企業等の業務システムではこちらのパターンであることが多い• パターン2 大量データに対する処理といった重い処理を、一括して実施する 大規模シミュレーターやAIの機械学習等
© 2020 NTT DATA Corporation 82.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 CorporationSpring Batchのアーキテクチャ【基本編】
© 2020 NTT DATA Corporation 103.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator)
© 2020 NTT DATA Corporation 113.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) Jobを起動
© 2020 NTT DATA Corporation 123.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) SpringBatchがバッチ処理を行う単位
© 2020 NTT DATA Corporation 133.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) Jobは複数のStepで構成され、Stepでデータへの処理を行う
© 2020 NTT DATA Corporation 143.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) JobRepositoryでJob、Stepの実行状態を管理する
© 2020 NTT DATA Corporation 153.Spring Batchのアーキテクチャ -ビジネスロジック実装-Chunk• 3つのインターフェースで構成されており、データを読み込み、業務処理、書きこみを実施• フラットファイル(CSV等)、XMLファイル、JSONファイル、DBアクセスを扱うのを容易にするために、サポートクラスも用意されている• 処理対象となるデータを1件ずつ処理するのではなく、一定件数のチャンクを単位とする• トランザクションは、チャンク単位の中間コミット方式となるStepItemReader ItemProcessor ItemWriterDataChunk ChunkItemItemItemItem
© 2020 NTT DATA Corporation 163.Spring Batchのアーキテクチャ -ビジネスロジック実装-Tasklet• executeという1つのメソッドをもつ単純なインターフェースで、Chunkに比べて実装も容易• Chunkモデルに当てはまらないような処理(入力データに関係のない処理)や、順序性の担保が必要な処理(コントロールブレイク処理等)に向いている• トランザクションは、Tasklet処理単位の一括コミット方式となる• TaskletからServiceクラスなどを呼び出す際は、そのトランザクション属性に注意• Serviceを別トランザクションとする場合は、Transactionalアノテーションのpropagation属性をREQUIRES_NEWとする等StepTasklet
© 2020 NTT DATA Corporation 173.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-@Configuration@EnableBatchProcessingpublic class JobConfig extends DefaultBatchConfigurer {//omitted@Beanpublic Step step01() {return stepBuilderFactory.get(“step01”).tasklet(tasklet()).build();}@Beanpublic Job job() throws Exception {return jobBuilderFactory.get(“job”).incrementer(new RunIdIncrementer()).listener(listener()).start(step01()).build();}//omitted}Job,Stepのサンプル(Configクラス)※Taskletの場合Step01を実行するJobTasklet01を実行するStepSpringBatchを有効にする
© 2020 NTT DATA Corporation 183.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-Job,Stepのサンプル(Configクラス)※Chunkの場合@Beanpublic Step step02() {return stepBuilderFactory.get("step02").<String, String> chunk(10).reader(itemReader()).processor(itemProcessor()).writer(itemWriter()).build();}@Beanpublic Job job() throws Exception {return jobBuilderFactory.get(“job”).incrementer(new RunIdIncrementer()).listener(listener()).start(step02()).build();}1つのchunkで扱うアイテム数
© 2020 NTT DATA Corporation 193.Spring Batchのアーキテクチャ -ジョブの起動-• 実行時にジョブを順次起動• デフォルトでは、Bean定義されたジョブが順次起動される• application.yml等でspring.batch.job.enabled = false とすると無効• Javaコマンド引数により起動• ShellScriptなどで、ComandLineJobRunnerを経由して起動する• 引数として、ジョブ起動設定ファイルパスやJobIDを設定する• キュー、DB等をポーリングして非同期実行• 監視処理を作成し、キューやDBを監視(SpringBatchは監視処理をもっていない)• 監視処理から、JobOperator経由で起動する
© 2020 NTT DATA Corporation 203.Spring Batchのアーキテクチャ -ジョブの起動-Listener• JobやStepの実行前後やエラー発生時に処理を挿入するためのインターフェース• Listenerないで、開始終了ログの出力を行ったりする• 様々なListenerインターフェースがあるが、以下が一般的• JobExecutionListener• StepExecutionListener• ChunkListener• ItemReadListener、ItemProcessListener、ItemWriteListener
© 2020 NTT DATA Corporation 213.Spring Batchのアーキテクチャ -ジョブの起動-public class JobListener extends JobExecutionListenerSupport {@Overridepublic void beforeJob(JobExecution jobExecution) {super.beforeJob(jobExecution);System.out.println("Start JOB");}@Overridepublic void afterJob(JobExecution jobExecution) {super.afterJob(jobExecution);System.out.println("End JOB");}}ListenerのサンプルコードJob実行後に呼び出されるJob実行前に呼び出される
© 2020 NTT DATA Corporation 223.Spring Batchのアーキテクチャ -ジョブ実行管理-• JobInstance :ジョブを管理する論理的な単位• ジョブ名(ジョブID)+ジョブパラメータのセットを一意に管理• 同一キー情報のJobInstanceは生成されない(実行エラーとなる)• ジョブは二重実行されない• JobExecution :ジョブを管理する物理的な実行単位• 失敗したジョブに対して再実行すると、新しいJobExecutionが作成される• StepExecution:ステップを管理する物理的な実行単位JobInstanceJobExecutionStepExecution**11
© 2020 NTT DATA Corporation 233.Spring Batchのアーキテクチャ -ジョブ実行管理-JobRepositoryのメタデータスキーマ• ジョブ実行管理はDB等で実施• デフォルトではインメモリで管理• 永続化が必要な場合は、自身でDBとスキーマを用意する必要あり※付録A:メタデータスキーマ, Spring Batch(Ver.4.3.0) - リファレンスドキュメント, https://tinyurl.com/y6cmdrrd, (参照2020-11-25)
© 2020 NTT DATA Corporation 243.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 CorporationSpring Batchのアーキテクチャ【応用編】
© 2020 NTT DATA Corporation 263.Spring Batchのアーキテクチャ -ジョブの再実行方式-再実行方式には大きく分けて、リラン、リスタートの2種類がある• リラン• ジョブを最初からやり直す方式• Taskletモデルが適している• リスタート• ジョブが中断したところから処理を再開する方式• 正常に処理できていたものをスキップし、未処理のものから処理を再開• Chunkモデルが適している
© 2020 NTT DATA Corporation 273.Spring Batchのアーキテクチャ -ジョブの再実行方式-リラン• リラン時、まったく同一の「ジョブ名(ジョブID)+ジョブパラメータ」では起動できない• 二重実行防止機能が働くため、ジョブパラメータを変更しリランする• 業務データの初期化等が必要(業務処理のべきとう性を担保することが望ましい)JobInstance1JobExecution1-1リラン JobInstance2JobExecution2-1
© 2020 NTT DATA Corporation 283.Spring Batchのアーキテクチャ -ジョブの再実行方式-リスタート• 処理再開位置を保持、取得し、再開位置までのデータスキップが必要• Chunkモデルを適用することで、比較的実現しやすい(中間コミットモデル)• 失敗したジョブのJobExecutionIDに対して「-restart」と指定することでリスタート可能• JobLauncherやJobOperatorから指定可能JobInstance1JobExecution1-1リスタートJobExecution1-2ジョブパラメータは、JobRepositoryから復元
© 2020 NTT DATA Corporation 29Job13.Spring Batchのアーキテクチャ -フロー制御-Step1Step2Step3シーケンシャルフロー• 全てのStepが順番に実行されるジョブ
© 2020 NTT DATA Corporation 30Job13.Spring Batchのアーキテクチャ -フロー制御-シーケンシャルフロー• 全てのStepが順番に実行されるジョブ• Step中の処理が異常終了した場合は、後続ステップを実行されない• Step2が失敗した場合、Step3は実行されないStep1Step2Step3実行されない
© 2020 NTT DATA Corporation 31Job13.Spring Batchのアーキテクチャ -フロー制御-シーケンシャルフロー• 全てのStepが順番に実行されるジョブ• Step中の処理が異常終了した場合は、後続ステップを実行されない• Step2が失敗した場合、Step3は実行されない• 異常終了の原因を取り除き、ジョブをリスタートした場合、異常終了したStepから処理をやり直すことが可能• Job1をリスタートした場合、Step2からリスタートStep1Step2Step3正常終了Stepは実行されないリスタート
© 2020 NTT DATA Corporation 323.Spring Batchのアーキテクチャ -フロー制御-Jobのサンプル(シーケンシャルフロー)@Beanpublic Job job() throws Exception {return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).listener(listener()).start(step01()).next(step02()).next(step03()).build();}startで最初のStepを指定し、nextで次のStepをつなげていくStep1Step2Step3
© 2020 NTT DATA Corporation 333.Spring Batchのアーキテクチャ -フロー制御-条件分岐• Stepの実行結果(ExitStatus)によって、後続のStepを変更する• 実行結果がFAILED以外の状態で、ジョブが終了してしまった場合、リスタートできなくなることがあるJob1Step1Step3 Step2成功したか?YesNo
© 2020 NTT DATA Corporation 343.Spring Batchのアーキテクチャ -フロー制御-Jobのサンプル(条件分岐)@Beanpublic 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();}Step1Step3 Step2成功したか?YesNoonで実行結果の文字列判定句を設定し、toで一致した場合のstepを指定※「*」はゼロ個以上の文字に一致する
© 2020 NTT DATA Corporation 353.Spring Batchのアーキテクチャ -並列処理-マルチスレッドステップ• 単一プロセス上で、Step(チャンク)単位でスレッドを作成• マルチスレッド化される際は、順序性が担保されないので、アイテムの処理に順序性が必要な場合は、本ステップは採用できない並行ステップ• 単一プロセス上で、スプリットフロー(複数のStepの連なり)単位でスレッドを作成
© 2020 NTT DATA Corporation 363.Spring Batchのアーキテクチャ -並列処理-@Beanpublic TaskExecutor taskExecutor() {return new SimpleAsyncTaskExecutor("spring_batch");}@Beanpublic 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 373.Spring Batchのアーキテクチャ -並列処理-Flowのサンプル(並行ステップ)@Beanpublic Flow flow1() {return new FlowBuilder<SimpleFlow>("flow1").start(step01()).next(step02()).build();}@Beanpublic Flow flow2() {return new FlowBuilder<SimpleFlow>("flow2").start(step03()).build();}step01→step02というStepの連なりを1つのFlowとするstep03の実行を1つのFlowとするFlow1Step1Step2Flow2Step3
© 2020 NTT DATA Corporation 383.Spring Batchのアーキテクチャ -並列処理-Jobのサンプル(並行ステップ)@Beanpublic Job job() {return jobBuilderFactory.get("job").start(splitFlow()).next(step04()).build().build();}@Beanpublic Flow splitFlow() {return new FlowBuilder<SimpleFlow>("splitFlow").split(taskExecutor()).add(flow1(), flow2()).build();}Flow1Step1Step2Flow2Step3Step4Flow1、Flow2を別スレッドで並走させるFlow1+Flow2の並走完了後、Step04を実行
© 2020 NTT DATA Corporation 393.Spring Batchのアーキテクチャ -多重処理-パーティショニング• Stepの実行を分割してマルチスレッドで実行する• Manager内の処理を特定の件数ごとに、自動的に分割しWorkerを作成する• 全てのWorkerの処理が完了したら、ManagerのStepを完了とするJob1Step1Step2(Manager)Step3WorkerWorkerWorkerWorkerWorker
© 2020 NTT DATA Corporation 403.Spring Batchのアーキテクチャ -多重処理-@Beanpublic Step stepManager() {return stepBuilderFactory.get("step2.manager").partitioner(step02()).partitioner("step2", partitioner()).gridSize(10).taskExecutor(taskExecutor()).build();}@Beanpublic Partitioner partitioner() {return new Partitioner01();}Stepのサンプル(Manegerステップ)Step02をパーティション化パーティショナーを追加パーティションの分割数を設定
© 2020 NTT DATA Corporation 413.Spring Batchのアーキテクチャ -多重処理-public class Partitioner01 implements Partitioner {@Overridepublic 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 434.クラウド環境でのSpring Batch -クラウド環境におけるバッチアプリケーション開発-以下のような理由から、バッチ処理はパブリッククラウドサービスと親和性が高い① バッチ処理は決まった時間のみ起動すればよく、パブリッククラウドサービスを利用した場合、コストメリットを得やすい インスタンスの種類や起動時間に対して課金されるため② 大量データを扱う場合、容易にスケールアウト可能であるため、業務量に応じたリソース設計が実現可能 余分なリソースを予め用意する必要がなく、コスト削減が狙えるAWSにおける、バッチアーキテクチャに適したマネージドサービスを紹介し、そのサービスでSpring Batchを利用する際の注意点を紹介する
© 2020 NTT DATA Corporation 444.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-AWS CloudAuto Scaling groupVPCECSJobQueueAWS BatchJobDefinitionECRCloud Watch LogsAWS Batchの利用• AWS Batchの実態は、ECS(コンテナオーケストレーションサービス)と独自のキュー• ECSをそのまま構築する際に考慮する必要がある、クラスタやサービス等が自動構築されるので構築が容易• キューにメッセージが送信されると、JobDefinitionに記載された定義の通りコンテナが起動する• コンテナはキューにメッセージが登録されてから起動するため、起動時間のバッファを考慮する必要あり・・・ ・・・コンテナイメージメッセージ登録 ログ出力
© 2020 NTT DATA Corporation 454.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-ECS + SQSの利用• 性能要件が厳しく、AWS Batchの起動時間が無視できない場合はECS + SQSの構成で対応• AWS Batchの起動時間はコンテナイメージのつくりにより異なる• ECS上でコンテナを常時起動することで、起動コストが発生しないようにする(維持コストは上がる)• JobQueueの代わりにSQSを利用• それぞれ個別に構築する必要があるので、構築コストは上がるAWS CloudVPCSQSECSバッチAP1 バッチAP2 バッチAP3・・・キュー1 キュー2・・・メッセージ登録
© 2020 NTT DATA Corporation 464.クラウド環境でのSpring Batch -アプリケーションのコンテナ化-• 紹介したマネージドサービスは、全てコンテナアプリケーションを前提としている• Spring Batchで作成したアプリケーションのDocker Imageを作成し、ECR(AWSの提供するDockerHubサービス)にpushする必要がある Dockerfileを作成しDocker Imageを用意するFROM amazoncorretto:11ARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar","-Dfile.encoding=UTF-8"]Dockerfileのサンプル AWSの提供するOpenJDK11をベースとするMaven等で作成したjarファイルをコピーコンテナ起動時にJavaコマンドでSpring Batchアプリケーションを起動
© 2020 NTT DATA Corporation 474.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-• 紹介したマネージドサービスは、キューに滞留したメッセージの量によって、コンテナを新たに起動することによって、スケールアウトを実現可能• アプリケーションは、コンテナが増えた際にスケールアウト可能な単位でジョブを設計する必要がある• 1ジョブで大量のファイルを取り扱う場合、複数のジョブから扱うファイルを重複させないようにする制御は難しく、結局、1つのジョブでやり切る必要がある• 1ジョブ1ファイルといった単位で処理することで、ファイル量が増えればジョブの数を増やし、ジョブの数が多くなれば(キューに滞留したメッセージ数が多い)コンテナを増やしてスケールアウトすることが可能
© 2020 NTT DATA Corporation 484.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-Job1ジョブで大量ファイルスケールアウトJobJob1ジョブで1ファイルスケールアウトJob1メッセージであたりのファイル数も大量になっており、スケールアウトしても、ファイルを同時に処理できないファイル数が増えれば、メッセージ数が増え、スケールアウトした先のジョブでも同時にファイルの処理が可能
© 2020 NTT DATA Corporation 494.クラウド環境でのSpring Batch -ジョブ管理テーブルの作成時の注意点-• RDS(RDBのマネージドサービス)上で、ジョブ管理テーブルを構築する必要がある• 前述の通り、コンテナ化したアプリがスケールアウトしていくと、RDSへのアクセス数が増加し、コネクションプールが枯渇してしまう場合がある• Spring Batchを利用する場合は、業務アプリケーション上で利用しない場合でもRDSが必要となるので、性能試験を実施してコネクションプール枯渇やCPU使用率高騰等の性能問題が発生しなか確認する必要がある
© 2020 NTT DATA Corporationおわりに
© 2020 NTT DATA Corporation 515.おわりに• バッチ処理ってなに?• データを一定期間集めて、一括して処理する方式• Spring Batchのアーキテクチャは?• Job、Stepで構成されている• ファイルやDBなどのデータ読み込み、処理、書きこみを実施することを前提としている• Tasklet、Chunkのモデルがあり、処理内容や再実行方式により選択する• Spring Batchはどうやって使うの?• Javaコマンド引数による指定• キューやDBをポーリングすることによる非同期実行
© 2020 NTT DATA Corporation 525.おわりに参考情報• 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ご静聴ありがとうございました本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

Recommended

PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
これからSpringを使う開発者が知っておくべきこと
PDF
The Twelve-Factor Appで考えるAWSのサービス開発
PPTX
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
PDF
実践 NestJS
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PDF
JVMのGCアルゴリズムとチューニング
PPTX
はじめてのElasticsearchクラスタ
PPTX
バッチは地味だが役に立つ
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PPTX
さくっと理解するSpring bootの仕組み
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
AWSのログ管理ベストプラクティス
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
Serverless時代のJavaについて
PDF
マイクロサービス 4つの分割アプローチ
PDF
例外設計における大罪
PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
それはYAGNIか? それとも思考停止か?
PDF
Springを何となく使ってる人が抑えるべきポイント
PPTX
Redisの特徴と活用方法について
PPTX
Linuxのsemaphoreとmutexを見る 
PDF
マイクロにしすぎた結果がこれだよ!
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PDF
新しいTERASOLUNA Batch Frameworkとは

More Related Content

PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
これからSpringを使う開発者が知っておくべきこと
PDF
The Twelve-Factor Appで考えるAWSのサービス開発
PPTX
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
PDF
実践 NestJS
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PDF
JVMのGCアルゴリズムとチューニング
PPTX
はじめてのElasticsearchクラスタ
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
これからSpringを使う開発者が知っておくべきこと
The Twelve-Factor Appで考えるAWSのサービス開発
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
実践 NestJS
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
JVMのGCアルゴリズムとチューニング
はじめてのElasticsearchクラスタ

What's hot

PPTX
バッチは地味だが役に立つ
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PPTX
さくっと理解するSpring bootの仕組み
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
AWSのログ管理ベストプラクティス
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
Serverless時代のJavaについて
PDF
マイクロサービス 4つの分割アプローチ
PDF
例外設計における大罪
PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
それはYAGNIか? それとも思考停止か?
PDF
Springを何となく使ってる人が抑えるべきポイント
PPTX
Redisの特徴と活用方法について
PPTX
Linuxのsemaphoreとmutexを見る 
PDF
マイクロにしすぎた結果がこれだよ!
バッチは地味だが役に立つ
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
さくっと理解するSpring bootの仕組み
ぱぱっと理解するSpring Cloudの基本
Spring Bootをはじめる時にやるべき10のこと
AWSのログ管理ベストプラクティス
マルチテナント化で知っておきたいデータベースのこと
ドメイン駆動設計サンプルコードの徹底解説
Serverless時代のJavaについて
マイクロサービス 4つの分割アプローチ
例外設計における大罪
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
入社1年目のプログラミング初心者がSpringを学ぶための手引き
怖くないSpring Bootのオートコンフィグレーション
それはYAGNIか? それとも思考停止か?
Springを何となく使ってる人が抑えるべきポイント
Redisの特徴と活用方法について
Linuxのsemaphoreとmutexを見る 
マイクロにしすぎた結果がこれだよ!

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

PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PDF
新しいTERASOLUNA Batch Frameworkとは
PDF
20170525 jsug バッチは地味だが役に立つ
PPTX
Batchは作ったことあるけど、 初めてSpring Batchを使ってみた
PDF
Jbatch実践入門 #jdt2015
PPTX
Spring 5に備えるリアクティブプログラミング入門
PPTX
Containers + EC2 Spot: AWS Batch による大規模バッチ処理でのスポットインスタンス活用
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
PDF
20160215 04 java ee7徹底入門 jbatch
PDF
Spark SQL - The internal -
PDF
JSR 352 “Batch Applications for the Java Platform”
PDF
ストリームデータ分散処理基盤Storm
PDF
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
PDF
Java Batch 仕様 (Public Review時点)
PDF
Spring “BigData”
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
新しいTERASOLUNA Batch Frameworkとは
20170525 jsug バッチは地味だが役に立つ
Batchは作ったことあるけど、 初めてSpring Batchを使ってみた
Jbatch実践入門 #jdt2015
Spring 5に備えるリアクティブプログラミング入門
Containers + EC2 Spot: AWS Batch による大規模バッチ処理でのスポットインスタンス活用
IoT時代におけるストリームデータ処理と急成長の Apache Flink
20160215 04 java ee7徹底入門 jbatch
Spark SQL - The internal -
JSR 352 “Batch Applications for the Java Platform”
ストリームデータ分散処理基盤Storm
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
Java Batch 仕様 (Public Review時点)
Spring “BigData”

More from NTT DATA Technology & Innovation

PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)

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

  • 1.
    © 2020 NTTDATA Corporation今こそ知りたいSpring Batch2020/12/17株式会社NTTデータ 公共・社会基盤事業推進部橋本 直樹
  • 2.
    © 2020 NTTDATA Corporation 20.はじめに -自己紹介-橋本 直樹(Naoki Hashimoto)株式会社NTTデータ公共・社会基盤事業推進部 プロジェクト推進統括部 技術戦略担当シニア・エキスパート• 開発経験• 主に、Spring Framework(TERASOLUNA Framework)を用いたWebアプリケーション開発• OAuth2.0の仕様に沿った、API認可アプリケーション開発• Spring Security OAuth(現在は、SpringSecurity5に統合)で実装• 最近の開発• AWS上のコンテナ環境で動作するSpring Batchアプリケーション開発
  • 3.
    © 2020 NTTDATA Corporation 30.はじめに -想定聴講者-• これから、バッチアプリケーションを開発しなければならないが、そもそもバッチってなに?• 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 61.バッチ処理とは? ~バッチ処理の定義~• データ処理におけるバッチ処理は、ひとまとまりのデータを一括して処理する方式である• 逐次生み出されるデータを一定期間・一定量集めたものをバッチといい、このバッチ単位で処理をおこなう方式がバッチ処理である※バッチ処理, Wikipedia, https://tinyurl.com/y43v4ulr, (参照2020-11-25)
  • 7.
    © 2020 NTTDATA Corporation 71.バッチ処理とは? ~バッチ処理パターン~• パターン1あらかじめ登録した一連の処理を自動的に実行する処理方式(※処理量は大小様々)• スケジュール起動• イベント起動(ファイル格納等)• オンラインディレード(REST API起動)企業等の業務システムではこちらのパターンであることが多い• パターン2 大量データに対する処理といった重い処理を、一括して実施する 大規模シミュレーターやAIの機械学習等
  • 8.
    © 2020 NTTDATA Corporation 82.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 CorporationSpring Batchのアーキテクチャ【基本編】
  • 10.
    © 2020 NTTDATA Corporation 103.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator)
  • 11.
    © 2020 NTTDATA Corporation 113.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) Jobを起動
  • 12.
    © 2020 NTTDATA Corporation 123.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) SpringBatchがバッチ処理を行う単位
  • 13.
    © 2020 NTTDATA Corporation 133.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) Jobは複数のStepで構成され、Stepでデータへの処理を行う
  • 14.
    © 2020 NTTDATA Corporation 143.Spring Batchのアーキテクチャ -ジョブの構成-Job1Step1 Step2 StepN・・・JobRepository・・・JobNJobLauncher(or JobOperator) JobRepositoryでJob、Stepの実行状態を管理する
  • 15.
    © 2020 NTTDATA Corporation 153.Spring Batchのアーキテクチャ -ビジネスロジック実装-Chunk• 3つのインターフェースで構成されており、データを読み込み、業務処理、書きこみを実施• フラットファイル(CSV等)、XMLファイル、JSONファイル、DBアクセスを扱うのを容易にするために、サポートクラスも用意されている• 処理対象となるデータを1件ずつ処理するのではなく、一定件数のチャンクを単位とする• トランザクションは、チャンク単位の中間コミット方式となるStepItemReader ItemProcessor ItemWriterDataChunk ChunkItemItemItemItem
  • 16.
    © 2020 NTTDATA Corporation 163.Spring Batchのアーキテクチャ -ビジネスロジック実装-Tasklet• executeという1つのメソッドをもつ単純なインターフェースで、Chunkに比べて実装も容易• Chunkモデルに当てはまらないような処理(入力データに関係のない処理)や、順序性の担保が必要な処理(コントロールブレイク処理等)に向いている• トランザクションは、Tasklet処理単位の一括コミット方式となる• TaskletからServiceクラスなどを呼び出す際は、そのトランザクション属性に注意• Serviceを別トランザクションとする場合は、Transactionalアノテーションのpropagation属性をREQUIRES_NEWとする等StepTasklet
  • 17.
    © 2020 NTTDATA Corporation 173.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-@Configuration@EnableBatchProcessingpublic class JobConfig extends DefaultBatchConfigurer {//omitted@Beanpublic Step step01() {return stepBuilderFactory.get(“step01”).tasklet(tasklet()).build();}@Beanpublic Job job() throws Exception {return jobBuilderFactory.get(“job”).incrementer(new RunIdIncrementer()).listener(listener()).start(step01()).build();}//omitted}Job,Stepのサンプル(Configクラス)※Taskletの場合Step01を実行するJobTasklet01を実行するStepSpringBatchを有効にする
  • 18.
    © 2020 NTTDATA Corporation 183.Spring Batchのアーキテクチャ -ジョブの構成、ビジネスロジック実装-Job,Stepのサンプル(Configクラス)※Chunkの場合@Beanpublic Step step02() {return stepBuilderFactory.get("step02").<String, String> chunk(10).reader(itemReader()).processor(itemProcessor()).writer(itemWriter()).build();}@Beanpublic Job job() throws Exception {return jobBuilderFactory.get(“job”).incrementer(new RunIdIncrementer()).listener(listener()).start(step02()).build();}1つのchunkで扱うアイテム数
  • 19.
    © 2020 NTTDATA Corporation 193.Spring Batchのアーキテクチャ -ジョブの起動-• 実行時にジョブを順次起動• デフォルトでは、Bean定義されたジョブが順次起動される• application.yml等でspring.batch.job.enabled = false とすると無効• Javaコマンド引数により起動• ShellScriptなどで、ComandLineJobRunnerを経由して起動する• 引数として、ジョブ起動設定ファイルパスやJobIDを設定する• キュー、DB等をポーリングして非同期実行• 監視処理を作成し、キューやDBを監視(SpringBatchは監視処理をもっていない)• 監視処理から、JobOperator経由で起動する
  • 20.
    © 2020 NTTDATA Corporation 203.Spring Batchのアーキテクチャ -ジョブの起動-Listener• JobやStepの実行前後やエラー発生時に処理を挿入するためのインターフェース• Listenerないで、開始終了ログの出力を行ったりする• 様々なListenerインターフェースがあるが、以下が一般的• JobExecutionListener• StepExecutionListener• ChunkListener• ItemReadListener、ItemProcessListener、ItemWriteListener
  • 21.
    © 2020 NTTDATA Corporation 213.Spring Batchのアーキテクチャ -ジョブの起動-public class JobListener extends JobExecutionListenerSupport {@Overridepublic void beforeJob(JobExecution jobExecution) {super.beforeJob(jobExecution);System.out.println("Start JOB");}@Overridepublic void afterJob(JobExecution jobExecution) {super.afterJob(jobExecution);System.out.println("End JOB");}}ListenerのサンプルコードJob実行後に呼び出されるJob実行前に呼び出される
  • 22.
    © 2020 NTTDATA Corporation 223.Spring Batchのアーキテクチャ -ジョブ実行管理-• JobInstance :ジョブを管理する論理的な単位• ジョブ名(ジョブID)+ジョブパラメータのセットを一意に管理• 同一キー情報のJobInstanceは生成されない(実行エラーとなる)• ジョブは二重実行されない• JobExecution :ジョブを管理する物理的な実行単位• 失敗したジョブに対して再実行すると、新しいJobExecutionが作成される• StepExecution:ステップを管理する物理的な実行単位JobInstanceJobExecutionStepExecution**11
  • 23.
    © 2020 NTTDATA Corporation 233.Spring Batchのアーキテクチャ -ジョブ実行管理-JobRepositoryのメタデータスキーマ• ジョブ実行管理はDB等で実施• デフォルトではインメモリで管理• 永続化が必要な場合は、自身でDBとスキーマを用意する必要あり※付録A:メタデータスキーマ, Spring Batch(Ver.4.3.0) - リファレンスドキュメント, https://tinyurl.com/y6cmdrrd, (参照2020-11-25)
  • 24.
    © 2020 NTTDATA Corporation 243.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 CorporationSpring Batchのアーキテクチャ【応用編】
  • 26.
    © 2020 NTTDATA Corporation 263.Spring Batchのアーキテクチャ -ジョブの再実行方式-再実行方式には大きく分けて、リラン、リスタートの2種類がある• リラン• ジョブを最初からやり直す方式• Taskletモデルが適している• リスタート• ジョブが中断したところから処理を再開する方式• 正常に処理できていたものをスキップし、未処理のものから処理を再開• Chunkモデルが適している
  • 27.
    © 2020 NTTDATA Corporation 273.Spring Batchのアーキテクチャ -ジョブの再実行方式-リラン• リラン時、まったく同一の「ジョブ名(ジョブID)+ジョブパラメータ」では起動できない• 二重実行防止機能が働くため、ジョブパラメータを変更しリランする• 業務データの初期化等が必要(業務処理のべきとう性を担保することが望ましい)JobInstance1JobExecution1-1リラン JobInstance2JobExecution2-1
  • 28.
    © 2020 NTTDATA Corporation 283.Spring Batchのアーキテクチャ -ジョブの再実行方式-リスタート• 処理再開位置を保持、取得し、再開位置までのデータスキップが必要• Chunkモデルを適用することで、比較的実現しやすい(中間コミットモデル)• 失敗したジョブのJobExecutionIDに対して「-restart」と指定することでリスタート可能• JobLauncherやJobOperatorから指定可能JobInstance1JobExecution1-1リスタートJobExecution1-2ジョブパラメータは、JobRepositoryから復元
  • 29.
    © 2020 NTTDATA Corporation 29Job13.Spring Batchのアーキテクチャ -フロー制御-Step1Step2Step3シーケンシャルフロー• 全てのStepが順番に実行されるジョブ
  • 30.
    © 2020 NTTDATA Corporation 30Job13.Spring Batchのアーキテクチャ -フロー制御-シーケンシャルフロー• 全てのStepが順番に実行されるジョブ• Step中の処理が異常終了した場合は、後続ステップを実行されない• Step2が失敗した場合、Step3は実行されないStep1Step2Step3実行されない
  • 31.
    © 2020 NTTDATA Corporation 31Job13.Spring Batchのアーキテクチャ -フロー制御-シーケンシャルフロー• 全てのStepが順番に実行されるジョブ• Step中の処理が異常終了した場合は、後続ステップを実行されない• Step2が失敗した場合、Step3は実行されない• 異常終了の原因を取り除き、ジョブをリスタートした場合、異常終了したStepから処理をやり直すことが可能• Job1をリスタートした場合、Step2からリスタートStep1Step2Step3正常終了Stepは実行されないリスタート
  • 32.
    © 2020 NTTDATA Corporation 323.Spring Batchのアーキテクチャ -フロー制御-Jobのサンプル(シーケンシャルフロー)@Beanpublic Job job() throws Exception {return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).listener(listener()).start(step01()).next(step02()).next(step03()).build();}startで最初のStepを指定し、nextで次のStepをつなげていくStep1Step2Step3
  • 33.
    © 2020 NTTDATA Corporation 333.Spring Batchのアーキテクチャ -フロー制御-条件分岐• Stepの実行結果(ExitStatus)によって、後続のStepを変更する• 実行結果がFAILED以外の状態で、ジョブが終了してしまった場合、リスタートできなくなることがあるJob1Step1Step3 Step2成功したか?YesNo
  • 34.
    © 2020 NTTDATA Corporation 343.Spring Batchのアーキテクチャ -フロー制御-Jobのサンプル(条件分岐)@Beanpublic 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();}Step1Step3 Step2成功したか?YesNoonで実行結果の文字列判定句を設定し、toで一致した場合のstepを指定※「*」はゼロ個以上の文字に一致する
  • 35.
    © 2020 NTTDATA Corporation 353.Spring Batchのアーキテクチャ -並列処理-マルチスレッドステップ• 単一プロセス上で、Step(チャンク)単位でスレッドを作成• マルチスレッド化される際は、順序性が担保されないので、アイテムの処理に順序性が必要な場合は、本ステップは採用できない並行ステップ• 単一プロセス上で、スプリットフロー(複数のStepの連なり)単位でスレッドを作成
  • 36.
    © 2020 NTTDATA Corporation 363.Spring Batchのアーキテクチャ -並列処理-@Beanpublic TaskExecutor taskExecutor() {return new SimpleAsyncTaskExecutor("spring_batch");}@Beanpublic 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 373.Spring Batchのアーキテクチャ -並列処理-Flowのサンプル(並行ステップ)@Beanpublic Flow flow1() {return new FlowBuilder<SimpleFlow>("flow1").start(step01()).next(step02()).build();}@Beanpublic Flow flow2() {return new FlowBuilder<SimpleFlow>("flow2").start(step03()).build();}step01→step02というStepの連なりを1つのFlowとするstep03の実行を1つのFlowとするFlow1Step1Step2Flow2Step3
  • 38.
    © 2020 NTTDATA Corporation 383.Spring Batchのアーキテクチャ -並列処理-Jobのサンプル(並行ステップ)@Beanpublic Job job() {return jobBuilderFactory.get("job").start(splitFlow()).next(step04()).build().build();}@Beanpublic Flow splitFlow() {return new FlowBuilder<SimpleFlow>("splitFlow").split(taskExecutor()).add(flow1(), flow2()).build();}Flow1Step1Step2Flow2Step3Step4Flow1、Flow2を別スレッドで並走させるFlow1+Flow2の並走完了後、Step04を実行
  • 39.
    © 2020 NTTDATA Corporation 393.Spring Batchのアーキテクチャ -多重処理-パーティショニング• Stepの実行を分割してマルチスレッドで実行する• Manager内の処理を特定の件数ごとに、自動的に分割しWorkerを作成する• 全てのWorkerの処理が完了したら、ManagerのStepを完了とするJob1Step1Step2(Manager)Step3WorkerWorkerWorkerWorkerWorker
  • 40.
    © 2020 NTTDATA Corporation 403.Spring Batchのアーキテクチャ -多重処理-@Beanpublic Step stepManager() {return stepBuilderFactory.get("step2.manager").partitioner(step02()).partitioner("step2", partitioner()).gridSize(10).taskExecutor(taskExecutor()).build();}@Beanpublic Partitioner partitioner() {return new Partitioner01();}Stepのサンプル(Manegerステップ)Step02をパーティション化パーティショナーを追加パーティションの分割数を設定
  • 41.
    © 2020 NTTDATA Corporation 413.Spring Batchのアーキテクチャ -多重処理-public class Partitioner01 implements Partitioner {@Overridepublic 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 434.クラウド環境でのSpring Batch -クラウド環境におけるバッチアプリケーション開発-以下のような理由から、バッチ処理はパブリッククラウドサービスと親和性が高い① バッチ処理は決まった時間のみ起動すればよく、パブリッククラウドサービスを利用した場合、コストメリットを得やすい インスタンスの種類や起動時間に対して課金されるため② 大量データを扱う場合、容易にスケールアウト可能であるため、業務量に応じたリソース設計が実現可能 余分なリソースを予め用意する必要がなく、コスト削減が狙えるAWSにおける、バッチアーキテクチャに適したマネージドサービスを紹介し、そのサービスでSpring Batchを利用する際の注意点を紹介する
  • 44.
    © 2020 NTTDATA Corporation 444.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-AWS CloudAuto Scaling groupVPCECSJobQueueAWS BatchJobDefinitionECRCloud Watch LogsAWS Batchの利用• AWS Batchの実態は、ECS(コンテナオーケストレーションサービス)と独自のキュー• ECSをそのまま構築する際に考慮する必要がある、クラスタやサービス等が自動構築されるので構築が容易• キューにメッセージが送信されると、JobDefinitionに記載された定義の通りコンテナが起動する• コンテナはキューにメッセージが登録されてから起動するため、起動時間のバッファを考慮する必要あり・・・ ・・・コンテナイメージメッセージ登録 ログ出力
  • 45.
    © 2020 NTTDATA Corporation 454.クラウド環境でのSpring Batch -バッチアーキテクチャに適したサービス-ECS + SQSの利用• 性能要件が厳しく、AWS Batchの起動時間が無視できない場合はECS + SQSの構成で対応• AWS Batchの起動時間はコンテナイメージのつくりにより異なる• ECS上でコンテナを常時起動することで、起動コストが発生しないようにする(維持コストは上がる)• JobQueueの代わりにSQSを利用• それぞれ個別に構築する必要があるので、構築コストは上がるAWS CloudVPCSQSECSバッチAP1 バッチAP2 バッチAP3・・・キュー1 キュー2・・・メッセージ登録
  • 46.
    © 2020 NTTDATA Corporation 464.クラウド環境でのSpring Batch -アプリケーションのコンテナ化-• 紹介したマネージドサービスは、全てコンテナアプリケーションを前提としている• Spring Batchで作成したアプリケーションのDocker Imageを作成し、ECR(AWSの提供するDockerHubサービス)にpushする必要がある Dockerfileを作成しDocker Imageを用意するFROM amazoncorretto:11ARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar","-Dfile.encoding=UTF-8"]Dockerfileのサンプル AWSの提供するOpenJDK11をベースとするMaven等で作成したjarファイルをコピーコンテナ起動時にJavaコマンドでSpring Batchアプリケーションを起動
  • 47.
    © 2020 NTTDATA Corporation 474.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-• 紹介したマネージドサービスは、キューに滞留したメッセージの量によって、コンテナを新たに起動することによって、スケールアウトを実現可能• アプリケーションは、コンテナが増えた際にスケールアウト可能な単位でジョブを設計する必要がある• 1ジョブで大量のファイルを取り扱う場合、複数のジョブから扱うファイルを重複させないようにする制御は難しく、結局、1つのジョブでやり切る必要がある• 1ジョブ1ファイルといった単位で処理することで、ファイル量が増えればジョブの数を増やし、ジョブの数が多くなれば(キューに滞留したメッセージ数が多い)コンテナを増やしてスケールアウトすることが可能
  • 48.
    © 2020 NTTDATA Corporation 484.クラウド環境でのSpring Batch -アプリケーションのスケールアウト-Job1ジョブで大量ファイルスケールアウトJobJob1ジョブで1ファイルスケールアウトJob1メッセージであたりのファイル数も大量になっており、スケールアウトしても、ファイルを同時に処理できないファイル数が増えれば、メッセージ数が増え、スケールアウトした先のジョブでも同時にファイルの処理が可能
  • 49.
    © 2020 NTTDATA Corporation 494.クラウド環境でのSpring Batch -ジョブ管理テーブルの作成時の注意点-• RDS(RDBのマネージドサービス)上で、ジョブ管理テーブルを構築する必要がある• 前述の通り、コンテナ化したアプリがスケールアウトしていくと、RDSへのアクセス数が増加し、コネクションプールが枯渇してしまう場合がある• Spring Batchを利用する場合は、業務アプリケーション上で利用しない場合でもRDSが必要となるので、性能試験を実施してコネクションプール枯渇やCPU使用率高騰等の性能問題が発生しなか確認する必要がある
  • 50.
    © 2020 NTTDATA Corporationおわりに
  • 51.
    © 2020 NTTDATA Corporation 515.おわりに• バッチ処理ってなに?• データを一定期間集めて、一括して処理する方式• Spring Batchのアーキテクチャは?• Job、Stepで構成されている• ファイルやDBなどのデータ読み込み、処理、書きこみを実施することを前提としている• Tasklet、Chunkのモデルがあり、処理内容や再実行方式により選択する• Spring Batchはどうやって使うの?• Javaコマンド引数による指定• キューやDBをポーリングすることによる非同期実行
  • 52.
    © 2020 NTTDATA Corporation 525.おわりに参考情報• 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ご静聴ありがとうございました本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

[8]ページ先頭

©2009-2025 Movatter.jp