障害時に起きること
障害時に起きること
Section titled “障害時に起きること”FastAPIアプリケーションで障害が発生した際のシナリオを詳しく解説します。
シナリオ1: 同期処理によるイベントループのブロック
Section titled “シナリオ1: 同期処理によるイベントループのブロック”障害のシナリオ
Section titled “障害のシナリオ”時刻: 2024-01-01 10:00:00状況: 大量のリクエスト処理中
10:00:00.000 - リクエスト1受信(外部APIを呼び出し開始)10:00:00.100 - 同期I/O操作によりイベントループがブロック10:00:05.000 - 外部API応答受信(5秒経過)10:00:05.100 - リクエスト2受信(5秒間待機していた)10:00:05.200 - リクエスト3受信(5秒間待機していた)10:00:05.300 - リクエスト4受信(5秒間待機していた)...10:00:10.000 - すべてのリクエストが処理される(10秒経過)実際のコード:
# ❌ 問題のあるコードimport requests
@app.post("/orders")async def create_order(order_data: OrderData): # 同期I/O操作によりイベントループがブロック response = requests.post("https://api.example.com/charge", json=order_data.dict()) return response.json()障害の影響:
- イベントループのブロック: 5秒間、イベントループがブロックされる
- 他のリクエストの処理不可: 5秒間、他のリクエストが処理できない
- タイムアウト: クライアントがタイムアウトする可能性がある
- パフォーマンスの低下: アプリケーション全体のパフォーマンスが低下する
解決策:
# ✅ 解決策: 非同期HTTPクライアントを使用import httpx
@app.post("/orders")async def create_order(order_data: OrderData): async with httpx.AsyncClient() as client: response = await client.post("https://api.example.com/charge", json=order_data.dict()) return response.json()障害時に起きることのポイント:
- 同期処理によるイベントループのブロック: 同期I/O操作によりイベントループがブロックされる、非同期HTTPクライアントを使用
これらの障害シナリオを理解することで、より堅牢なFastAPIアプリケーションを構築できます。