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

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

Avatar for Shuhei Kanamori Shuhei Kanamori
December 21, 2025
180

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特性を諦める → 運用設計で安全性担保 ◦ ロジックによる冪等性担保 + 手動リカバリ + モニタリングでカバー 学び