プログラミング
リトライストームラボ
要約
Retry Storm Labは、部分的な依存関係の障害とリトライポリシーをシミュレートするPython製ツールです。リトライがサービスの回復を妨げ、負荷を増幅させるシナリオを可視化し、即時、固定、指数関数的、フルジッターバックオフといった異なるリトライ戦略の効果を比較分析します。本ツールは、リトライのダイナミクスを理解しやすくするためのシンプルなキューイングモデルとして設計されています。
全文翻訳
リトライは無料ではありません。リカバリポリシーがアウトエージ(障害)となるタイミングを確認してください。
Retry Storm Labは、部分的な依存関係の障害をシミュレートする決定論的なPythonシミュレーターです。
これは、新しいリクエストとリトライが同じキャパシティを奪い合う様子をモデル化し、即時、固定、指数関数的、フルジッターバックオフポリシーを比較します。
なぜこれが存在するのか
障害が短く、利用可能なキャパシティがある場合、リトライは信頼性を向上させます。しかし、持続的な部分的な障害の間、同期されたクライアントは代わりに需要を増幅させ、新しいリクエストを飢えさせ、回復中のサービスを過負荷状態に保つ可能性があります。
このシミュレーターは、そのフィードバックループを可視化します。
一定の新しいリクエストストリームを生成します。
設定可能な障害ウィンドウ中に成功したキャパシティを減少させます。
選択されたポリシーを使用して、失敗したリクエストと過剰キャパシティのリクエストを再スケジュールします。
増幅、ピーク需要、放棄されたリクエスト、回復時間を測定します。
同じシナリオと乱数シードに対して、4つのポリシーすべてを比較します。
これは意図的に小さなキューイングモデルであり、本番環境のキャパシティプランナーではありません。ネットワーク遅延の分布、クライアントタイムアウト、オートスケーリング、サーキットブレーカー、相関するダウンストリーム障害は省略されています。その役割は、リトライのダイナミクスを検査しやすく、議論しやすくすることです。
インタラクティブなラボを実行する
Python 3.11以降が必要です。
python -m venv .venv
source .venv/bin/activate
pip install -e .
streamlit run app.py
http://localhost:8501 を開き、プリセットを選択し、サイドバーからワークロードを調整します。
CLIを使用する
retry-storm-lab --preset "Rate-limit spiral" --compare
retry-storm-lab --preset "Slow recovery" --policy full_jitter --json
例:比較
immediate amplification=1.11x peak=2720 rps success=97.2% recovery=1s
fixed amplification=1.08x peak=1600 rps success=99.9% recovery=3s
exponential amplification=1.07x peak=1600 rps success=100.0% recovery=3s
full_jitter amplification=1.10x peak=1651 rps success=99.9% recovery=3s
正確な値は、選択されたプリセットとシードによって異なります。
シミュレーションエンジンを使用する
from retry_storm_lab import BackoffPolicy, SimulationConfig, simulate
result = simulate(
SimulationConfig(
baseline_rps=800,
server_capacity_rps=1_000,
outage_failure_percent=80,
policy=BackoffPolicy.FULL_JITTER,
)
)
print(result.amplification_factor)
print(result.peak_rps)
print(result.recovery_seconds)
エンジンは、集計された100ミリ秒のバケットを使用します。フルジッターは、シードされた擬似乱数ジェネレーターを使用してリトライを個別に分散するため、同じ構成は常に同じ結果を生成します。
オプションの集計テレメトリ
ラボは完全にオフラインで動作します。Telemetryで集計された使用状況バンドを記録するには、オプションの依存関係をインストールし、プロジェクトAPIキーを提供します。
pip install -e '.[telemetry]'
export TELEMETRY_API_KEY=your_project_api_key
streamlit run app.py
送信されるのは、選択されたポリシー、広範なキャパシティ/増幅バンド、および実行が回復したかどうかのみです。生のワークロード値やタイムラインデータはログに記録されません。
開発
python -m unittest discover -s tests -v
python -m compileall app.py
retry_storm_lab
ライセンス
MIT