Upgrade to Pro — share decks privately, control downloads, hide ads and more …

バッチ処理が終わらない!? -処理時間を90%削減した話-

バッチ処理が終わらない!? -処理時間を90%削減した話-

2024/03/27 に開催された TechBrew in 東京 〜バッチ処理 最適化の取り組み〜(https://findy.connpass.com/event/312637/) の登壇資料です。

Red Frasco

March 27, 2024
Tweet

More Decks by Red Frasco

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 猪熊 朔也 ( いのくま さくや ) / @sinocloudon -

    株式会社 Red Frasco - インフラエンジニア u経歴 - ⾦融系 SIer, リクルート(SUUMO), ⾦融系スタートアップ, 現職 uその他コメント - うどんが好きです - ラーメン⼆郎が好きです - うどん脳 をプロフィールアイコンにすることが多いです 3
  2. 不動産会社向けの業務⽀援システムにおける事例です 6 不動産会社 担当者 ⼊⼒ 変換 連携 業務⽀援 システム 他システム

    物件データ 画像データ ⼿⼊⼒ 連携先システム ⾃動連携 システムA システムB システムC システムD ⾃動連携 ⾃動連携 ⾃動連携 ⾃動連携
  3. システム構成 • Java で開発しており、Web アプリとバッチが存在します • バッチの構成は以下のとおりです • アプリケーション︓Spring Boot,

    Spring Batch • AWSサービス︓EventBridge, Step Function, AWS Batch(※) 7 Amazon EventBridge AWS Step Functions workflow AWS Batch AWS Batch AWS Batch ※ジョブの内容によって、ECS や Lambda も使⽤しています
  4. バッチ処理概要 8 物件データ 抽出 • 登録した物件データを抽出し、ポータルサイトにデータ連携 • 物件画像は公開⽤のS3にコピーする • ポータルサイトの仕様に合わせてデータを変換する

    • 作成したCSVファイルをZIP化して送信する • 不動産の店舗の数だけバッチを動かす(店舗単位でバッチジョブを並列実⾏) S3に画像 コピー Aurora データ変換 ファイル 送信 内部 S3 公開⽤ S3 Get Put
  5. どんな性能課題が発⽣したのか 10 物件データ 抽出 • 1店舗分の物件データ5,800件の処理におよそ60分かかった • 将来的には100店舗以上のデータを捌くことを想定しているため、1店舗あ たり60分はかなり厳しい… •

    物件掲載に時間がかかるシステムは当然ビジネス的にもマズい… S3に画像 コピー Aurora データ変換 ファイル 送信 内部 S3 公開⽤ S3 Get Put 1分未満 1分未満 37分 22分
  6. 処理の内訳を分析してみる • S3に画像コピー処理全体︓約37分 • 建物画像︓3分52秒 / 4,135枚 • 1枚あたりの処理時間︓56.1ミリ秒/枚 •

    部屋画像︓32分28秒 / 38,690枚 • 1枚あたりの処理時間︓50.3ミリ秒/枚 • 周辺環境画像︓355ミリ秒 / 6枚 • 1枚あたりの処理時間︓59.1ミリ秒/枚 13 • 枚数にかかわらず処理性能が⼀定 • S3画像コピー処理を並列化(シングルスレッド→マルチスレッド)してみた
  7. Java の Parallel Stream を使⽤する • 多重度の設定(並列数20に設定) • ForkJoinPool customThreadPool

    = new ForkJoinPool(copyImageParallelism); • 並列実⾏ • customThreadPool.submit(() -> buildingObjectPathList.parallelStream().forEach(objectPath -> buildingObjectPathMap.put(objectPath, copyS3ToOpen(objectPath)))).get(); 14
  8. 処理の内訳を分析してみる その2 • データ変換をさらに深掘り • 変換⽅法ごとに処理時間の平均をとった結果 • CALL_METHOD(リフレクションを使った処理) • 0.87

    ミリ秒/項⽬ • CONST(定数設定) • 0.55 ミリ秒/項⽬ • INPUT(⼊⼒値設定) • 0.76 ミリ秒/項⽬ • MAPPING(マッピング) • 0.77 ミリ秒/項⽬ • NONE(何もしない) • 0.27 ミリ秒/項⽬ 18
  9. 処理の内訳を分析してみる その3 • データ変換をさらに深掘り • 処理時間の⼤きい変換項⽬を抽出した結果(TOP3のみ抜粋) • aboutPrice • CALL_METHOD

    6.32 ミリ秒/項⽬ • interiorContents • CALL_METHOD 4.61 ミリ秒/項⽬ • roomSituationCode • CALL_METHOD 3.05 ミリ秒/項⽬ 19 • リフレクションを使っており、メソッドの引数が多い項⽬ほど処理時間が⼤きい • リフレクションがボトルネックになっていると判断し、実装を変更
  10. おさらい︓改善前 24 物件データ 抽出 S3に画像 コピー Aurora データ変換 ファイル 送信

    内部 S3 公開⽤ S3 Get Put 1分未満 1分未満 約37分 約22分 課題1 課題2 約60分
  11. おさらい︓改善後 25 物件データ 抽出 S3に画像 コピー Aurora データ変換 ファイル 送信

    内部 S3 公開⽤ S3 Get Put 1分未満 1分未満 約6分 約10秒 課題1 課題2 約6~7分