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

2時間かかる月次バッチを 10分に短縮した スケーラブルなバッチアーキテクチャ改善

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Shuhei Kanamori Shuhei Kanamori
December 21, 2025
190

2時間かかる月次バッチを 10分に短縮した スケーラブルなバッチアーキテクチャ改善

【6社共催】スケールするサービスにおけるアーキテクチャの工夫・苦労を語る会 でのLT資料です

Avatar for Shuhei Kanamori

Shuhei Kanamori

December 21, 2025
Tweet

Transcript

  1. 🔍 対象の「企業」をデータベースから取得し、ループで処理する 🔍 内部的には複数のDBテーブルに対して、指定のバッチサイズごとに Read した後 に、パラメータを整形して Bulk Insert, Update

    をしている(レコード数は100~200万くら い) 🔍 単発のジョブで実行されており、失敗するとロールバックのジョブを流してから再リラ ンする必要がある 🔍 CPUよりも、DBのI/Oが支配的である 月次バッチの処理とボトルネック
  2. ❌ ロックによる他の処理のブロック • 大企業1社で大量のレコード → 処理時間: 10分程度 • 10分レコードロックがかかるのは他処理との兼ね合いで許容できない •

    時限までに正しい結果が揃っていればいい(結果整合性を許容できる) 企業単位トランザクションの評価 企業の集約単位でトランザクションを張らない判断 ACID原則による整合性が保証できなくなるため 運用設計で安全性を担保する必要がある
  3. ✅ Runbook(障害対応手順書)の整備 • 想定可能な障害パターン別のリカバリ手順を用意 • ログベースアラートで、エラー種別ごとに異なるRunbookを添付するようなアラート および手順の整備 ✅ ロジックによる冪等性の確保 •

    リカバリ手順をシンプルにするため再実行時に重複レコードが作られないようなハ ンドリング • すでに処理済みのステップはスキップ 運用設計で安全性を担保
  4. • パフォーマンス :ECSタスク台数分の並列度で処理できる • スケーラビリティ :企業が増えても、ECSのタスク台数を増やすことで、処理時間の 増加を抑制できる • 耐障害性:個別の企業(ジョブ)でエラーが発生しても、他の企業の処理には影響 せず、失敗したジョブのみを個別にリトライ可能

    (前は1件でも発生すると即障害) • 負荷軽減:Sidekiqのジョブキューを分離し、さらに既存Sidekiqとは別のECSサー ビスに切り出し、他のジョブに影響しない/されないように 非同期処理アーキテクチャのメリット
  5. • 「並列化の単位」と「トランザクションを張るか」は別の判断 ◦ 並列化: ドメインの境界(企業単位) ◦ トランザクション: 非機能要件(企業単位では張らない) • トランザクションを張るかの判断基準

    ◦ ロック競合の影響(最重要) ◦ データ整合性の要求レベル(要件的に結果整合性を許容できる) • DBトランザクションを諦める選択肢 ◦ ACID特性を諦める → 運用設計で安全性担保 ◦ ロジックによる冪等性担保 + 手動リカバリ + モニタリングでカバー 学び