Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2時間かかる月次バッチを 10分に短縮した スケーラブルなバッチアーキテクチャ改善
Search
Shuhei Kanamori
December 21, 2025
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2時間かかる月次バッチを 10分に短縮した スケーラブルなバッチアーキテクチャ改善
【6社共催】スケールするサービスにおけるアーキテクチャの工夫・苦労を語る会 でのLT資料です
Shuhei Kanamori
December 21, 2025
More Decks by Shuhei Kanamori
See All by Shuhei Kanamori
可観測性を目的思考で捉え直す_-Squadが自律的に改善できるO11y基盤づくり_Railsモジュラーモノリス___DevPlatform_Squadの取り組み-
moneyforest
0
65
サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩(サンプリング編)
moneyforest
1
130
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
210
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Accessibility Awareness
sabderemane
1
150
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Faster Mobile Websites
deanohume
310
32k
GraphQLとの向き合い方2022年版
quramy
50
15k
Deep Space Network (abreviated)
tonyrice
0
220
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
230
Done Done
chrislema
186
16k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
2時間かかる月次バッチを 10分に短縮した スケーラブルな バッチアーキテクチャ改善 金森 秀平(プラットフォームエンジニアリング1G) @_MoneyForest
自己紹介
自己紹介 金森 秀平(@_MoneyForest) - 所属: タイミー プラットフォームエンジ ニアリングチーム 1G -
うさぎ(7歳♂)を育ててます - SIer -> Backend -> SRE
🔍 2時間かかる月次バッチを10分に短縮した事例についてお話しします 🔍 前半で月次バッチが抱える問題を紹介し、後半でその改善アプローチについてお話 しします はじめに
1 月次バッチの概要
🔍 月初めに起動する 🔍 月次バッチの完了後、お客様に対して手動での後工程が存在する 🔍 2時間以内には月次バッチの全プロセスを完了させておく必要がある 🔍 月次バッチが遅延してしまうと、お客様の事務処理にご迷惑をおかけしてしまう恐 れがある 月次バッチの制約
🔍 対象の「企業」をデータベースから取得し、ループで処理する 🔍 内部的には複数のDBテーブルに対して、指定のバッチサイズごとに Read した後 に、パラメータを整形して Bulk Insert, Update
をしている(レコード数は100~200万くら い) 🔍 単発のジョブで実行されており、失敗するとロールバックのジョブを流してから再リラ ンする必要がある 🔍 CPUよりも、DBのI/Oが支配的である 月次バッチの処理とボトルネック
2 月次バッチが 直面する問題
線形に増えるデータ量 2026年1月以降はいつ処理時間が2時間を超えてもおかしくない状況に 2025/04/01時点での処理時間予測グラフ 🔍既に2時間を超えていたこともある 😇 🔍年末は稼働数が多いので、 2時間を超 えてもおかしくない 😇 🔍来年5月からは定常的に
2時間を超える 😇
タイミングをずらすことも難しい 🔍 月次バッチの大量データは月末で確定する 🔍 月末で確定したのち、速やかに計算する必要がある 🔍 お客様への業務プロセスにも影響するため、ずらすことが難しい
じゃあどうするか? 抜本的に処理を改善 するしかない
3 月次バッチの抜本改善
🔍 各処理は企業単位でループして いるため、企業単位で並列化するア プローチを検討 改善アプローチ
1. データの依存関係を分析 2. トランザクション境界の判断 3. 運用設計で安全性を担保 4. 非同期処理アーキテクチャの適用 改善手順
データの依存関係を分析(スキーマ・モデル構造) 🔍 作成、更新するテーブルはすべて企業 をルートとして辿れることを確認 ✅ 企業単位での集約が可能で、ロジック が集約の中に閉じている可能性
データの依存関係を分析(副作用の確認) 🔍 処理について企業の 集約同士でそれぞれの集 約への副作用が発生しな いことを確認 ✅ 並列化によりロックの 競合が発生しない ✅
並列化により不整合 データを作ってしまう恐れ がない
🔍 ここまでで「企業の集約単位でビジネスロジックが独立している」ことを確認 ✅ 企業の集約単位で1つのトランザクションにすることができる ✅ トランザクションのACID原則により、ビジネスロジック単位の整合性を保証できる トランザクション境界の判断 ただし問題が・・・
❌ ロックによる他の処理のブロック • 大企業1社で大量のレコード → 処理時間: 10分程度 • 10分レコードロックがかかるのは他処理との兼ね合いで許容できない •
時限までに正しい結果が揃っていればいい(結果整合性を許容できる) 企業単位トランザクションの評価 企業の集約単位でトランザクションを張らない判断 ACID原則による整合性が保証できなくなるため 運用設計で安全性を担保する必要がある
✅ 自動リトライの無効化 & 厳密なエラーハンドリング • 不確実な自動リトライで状況を悪化させない • エラー箇所によって異なるリカバリオペレーションが必要 運用設計で安全性を担保
✅ Runbook(障害対応手順書)の整備 • 想定可能な障害パターン別のリカバリ手順を用意 • ログベースアラートで、エラー種別ごとに異なるRunbookを添付するようなアラート および手順の整備 ✅ ロジックによる冪等性の確保 •
リカバリ手順をシンプルにするため再実行時に重複レコードが作られないようなハ ンドリング • すでに処理済みのステップはスキップ 運用設計で安全性を担保
• 既存資産のSidekiqを活用した非同期処理アーキテクチャを構築 非同期処理アーキテクチャの適用
• パフォーマンス :ECSタスク台数分の並列度で処理できる • スケーラビリティ :企業が増えても、ECSのタスク台数を増やすことで、処理時間の 増加を抑制できる • 耐障害性:個別の企業(ジョブ)でエラーが発生しても、他の企業の処理には影響 せず、失敗したジョブのみを個別にリトライ可能
(前は1件でも発生すると即障害) • 負荷軽減:Sidekiqのジョブキューを分離し、さらに既存Sidekiqとは別のECSサー ビスに切り出し、他のジョブに影響しない/されないように 非同期処理アーキテクチャのメリット
4 学び
• 「並列化の単位」と「トランザクションを張るか」は別の判断 ◦ 並列化: ドメインの境界(企業単位) ◦ トランザクション: 非機能要件(企業単位では張らない) • トランザクションを張るかの判断基準
◦ ロック競合の影響(最重要) ◦ データ整合性の要求レベル(要件的に結果整合性を許容できる) • DBトランザクションを諦める選択肢 ◦ ACID特性を諦める → 運用設計で安全性担保 ◦ ロジックによる冪等性担保 + 手動リカバリ + モニタリングでカバー 学び
ご清聴ありがとうございました!