Skip to content

feat: Extract ECSタスクの高速化(26時間→2-3時間)#219

Merged
ayuki-joto merged 5 commits intomainfrom
feature/extract-ecs-optimization
Feb 21, 2026
Merged

feat: Extract ECSタスクの高速化(26時間→2-3時間)#219
ayuki-joto merged 5 commits intomainfrom
feature/extract-ecs-optimization

Conversation

@ayuki-joto
Copy link
Contributor

Summary

Extract ECSタスクが 26.7時間(2/19 00:15 → 2/20 02:55 JST)かかっていた処理を、以下の最適化により 2-3時間 に短縮します。

主な変更点

  • SQSバッチ送信: 個別 send_messagesend_message_batch(最大10件/コール)でAPIコール数を1/10に削減
  • モジュールレベルSQSクライアント: 毎回のクライアント再生成コストを排除
  • Notes N+1クエリ解消: 2.4M件の個別DBクエリ → IN句バッチ取得+差分更新
  • notes_missing_language再enqueue廃止: 毎回~2.2M件の冗長なSQS送信を削除(backfillで自然にカバー)
  • ステータス履歴バッチDELETE: 1行ごとのDELETE → IN句バッチDELETE
  • Ratingsバッチサイズ拡大: 1000→5000でDB往復回数を1/5に削減
  • Backfillバッチ送信化: 個別SQS送信 → バッチ送信、batch_limit 10000→50000
  • DBコネクションプール: ECSタスク用にコネクションプーリング有効化(Lambda側は既存のNullPool維持)

想定効果

フェーズ Before After 短縮
Notes (SQS+DB) ~10h ~35min ~9.4h
Ratings ~6.7h ~1.5h ~5.2h
Status (DELETE+SQS) ~10h ~1h ~9h
合計 ~26.7h ~2.75h ~24h

変更ファイル

  • etl/src/birdxplorer_etl/extract_ecs.py — SQSバッチ送信、N+1解消、バッチDELETE、フェーズタイミングログ
  • etl/src/birdxplorer_etl/lib/sqlite/init.pyinit_postgresql(use_pool) パラメータ追加
  • etl/src/birdxplorer_etl/run_extract.py — ECS用 use_pool=True 呼び出し

Test plan

  • CloudWatchログで [PHASE_COMPLETE] タイミングを確認
  • SQSメッセージ数が大幅に減少していることを確認
  • notes_missing_language の再enqueueが発生しないことを確認
  • Lambda関数が既存通り動作することを確認(NullPool維持)
  • Backfillが正常に動作することを確認

🤖 Generated with Claude Code

ayuki-joto and others added 5 commits February 20, 2026 10:33
init_postgresql()にuse_poolパラメータを追加し、ECSタスクでコネクション
プーリングを使用可能にする。Lambda関数はデフォルトのNullPoolを維持し
後方互換性を保つ。

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- モジュールレベルSQSクライアントのシングルトン化で再生成コスト排除
- send_message_batch API(最大10件/コール)によるバッチ送信ヘルパー追加
- Notes処理: 1行ごとのDBクエリ → IN句バッチ取得+差分更新に変更
- notes_missing_language の毎バッチ再enqueue(~2.2M件)を廃止
- _flush_notes_batch ヘルパーでバッチ処理を集約

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- 1行ごとの個別DELETE → IN句によるバッチDELETEに変更
- enqueue_note_status_batch追加でステータス更新SQSもバッチ送信化
- 旧enqueue_note_status_update関数を削除
- ステータス処理フェーズのタイミングログ追加

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Ratingsバッチサイズを1000→5000に拡大しDB往復回数を1/5に削減
- Backfillのbatch_limitを10000→50000に拡大
- Backfillの個別SQS送信をenqueue_notes_batchに置き換え
- 旧enqueue_notes関数を削除
- Ratings/Backfillフェーズのタイミングログ追加

Co-Authored-By: Claude Opus 4.6 <[email protected]>
DELETE→INSERT パターンで発生する dead tuples を排除し、
ステータスが実際に変更されたノートのみ SQS enqueue することで
下流 Lambda の無駄な起動を大幅に削減する。

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@ayuki-joto ayuki-joto merged commit 0c0011a into main Feb 21, 2026
12 checks passed
@ayuki-joto ayuki-joto deleted the feature/extract-ecs-optimization branch February 21, 2026 03:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant