Skip to content

障害時に起きること

FastAPIアプリケーションで障害が発生した際のシナリオを詳しく解説します。

シナリオ1: 同期処理によるイベントループのブロック

Section titled “シナリオ1: 同期処理によるイベントループのブロック”
時刻: 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()

障害の影響:

  1. イベントループのブロック: 5秒間、イベントループがブロックされる
  2. 他のリクエストの処理不可: 5秒間、他のリクエストが処理できない
  3. タイムアウト: クライアントがタイムアウトする可能性がある
  4. パフォーマンスの低下: アプリケーション全体のパフォーマンスが低下する

解決策:

# ✅ 解決策: 非同期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アプリケーションを構築できます。