【要約】ユニバースを状態機械にしたら、次はバッチ中断カスケードが出てきた [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が、APIのクォータ制限下で銘柄の新規取得がゼロになる問題に直面した。当初はユニバースの枠が不足していると推測したが、実際には以下の技術的要因が重なっていた。
- ・ソート不備:
select_stalest_symbolsの条件分岐により、古い順のソートが機能していなかった。 - ・バッチの脆弱性:
fetch_daily_klines_range_batchが1件の例外でループ全体を脱出する設計だった。 - ・エラーの連鎖:16番目の窓外銘柄でのクォータ切れが、後続の窓内91件の更新を阻害していた。
// Approach
開発者は、ユニバースの管理モデルとバッチ処理の実行フェーズを根本から見直した。まず、銘柄の持ち方を固定リストから、入退会を持つ状態機械へと変更した。次に、バッチ処理を以下の3相構成に分割し、耐障害性を高めた。
- ・第1相:窓内のcached銘柄を更新する。費用ゼロかつ、絶対に中断させない。
- ・第2相:missing銘柄を新規取得する。remainingを全充当する。
- ・第3相:窓外のcached銘柄を更新する。余ったスロットのみを使用する。
// Result
設計の刷新により、銘柄カバレッジの欠損解消と処理の堅牢化を実現した。具体的な成果は以下の通りである。
- ・カバレッジの改善:売買代金順のキャッシュにより、未評価銘柄の問題を解消した。
- ・振動の抑制:ヒステリシスを導入し、境界付近での頻繁な入退会を防いだ。
- ・更新の保証:3相構成により、API制限下でも窓内データの更新を完遂できる。
Senior Engineer Insight
> API制限がある環境では、単一の失敗が全体を停止させる設計は極めて危険だ。本記事の「3相構成」は、重要度の高い処理を最優先し、失敗の影響を局所化する優れた戦略である。また、デバッグにおいて「推測」を排除し、「数字の内訳を分解する」姿勢は、大規模システム運用における鉄則だ。「理屈では動くはず」という慢心を捨て、常にデータの事実に基づき検証する重要性を再認識させる。