💬

SpringBatchを紹介します。

2022/12/22に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

SpringBatchを勉強する理由


私がSpringBatchを勉強する理由は、大容量データを処理することでサーバーの性能を向上させることができると考えたからです。上記のイメージのようにBatchを使用するとデータを分割して処理することができます。しかしBatchを使わないと大容量のデータを一気に処理するので、メモリとサーバの負荷があると思います。

Spring Batchの誕生背景

https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/spring-batch-intro.html#spring-batch-intro

Batch処理で要求される再利用可能なJavaベースのBatchアーキテクチャ標準の必要性が台頭しました。Spring BatchはSpringSourceとAccentrueの合作で誕生しました。
Accentrue : Batchアーキテクチャを実装しながら培った技術的な経験とノウハウ
SpringSource : 深みのある技術的基盤とSpringのプログラミングモデル

SpringBatchのPattern

SpringBatchで重要な3つのPatternを紹介します。

Read - データベース、ファイル、キューから大量のデータを照会します。
Process - 特定の方法でデータを加工します。
Write - データを修正されたフォームで再保存します。

この3つのPatternのRead、Process、WriteはデータベースのETLと意味が似ています。
抽出(Extract)、変換(Transform)、ロード(Load)です。

SpringBatchを使用する利点

  1. Batchの周期的commit : 大容量のデータを一度に全部commitすると、メモリまたはサーバーに多くの負荷を引き起こします。そのため、大容量のデータをある単位にデータを分離してcommitする機能を提供します。
  2. 同時多発的なJobの配置処理、大容量の並列処理 : multi threadでJobを処理することです。大容量のデータを複数のスレッドが処理すると、時間も短縮され、パフォーマンスも向上します。
  3. 失敗後、手動またはスケジューリングによる再起動
  4. 依存関係のあるsetp複数を順次処理 : Jobには複数のsetpが存在します。このstepを順番に処理させてくれます。
  5. 条件的Flow構成による体系的で柔軟な配置モデル構成 : 例えばif条件でTrueの場合は実行Falseの場合は実行しないように流れを構成することができます。
  6. 繰り返し、再試行、Skip処理 : 例外であっても重要でなければSkipしたりなどがあります。

書いたよりもっと様々な利点があると思いますが、私が重要だと思う事を作成しました。

SpringBatch architecture image

Application : SpringBatch Fraemworkを通じて開発者が作ったすべてのBatch Jobとコードが含まれています。開発者はビジネスロジックにのみ集中でき、共通のテクノロジーはFraemwork担当となります。

Batch Core : Jobを実行、モニタリング、管理するAPIで構成されています。JobLauncher、Job、Step、Flowなどがあります。

Batch Infrastructure : ApplicationとCoreの両方がInfrastructureの上でBuildされます。Jobの実行と処理を行うclassがあります。Reader、Processor、Writer、Skip、Retryなどです。

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>

Spring Batchを使用するためには、dependencyを追加します。librariesを確認してみると、BatchCoreを確認することができます。そして@EnableBatchProcessingを追加でBatchを活性化させます。

Discussion