05-4. 並行請求處理 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階)
🤔 一句話解釋 並行請求處理讓你同時發送多個 HTTP 請求,大幅縮短等待外部 API 的時間。
🔄 串行 vs 並行 串行請求(Sequential): API 1: ████████████░░░░░░░░░░░░ 2s API 2: ████████████░░░░░░░░ 2s API 3: ████████████ 2s 總時間: 6 秒 並行請求(Concurrent): API 1: ████████████ 2s API 2: ████████████ 2s API 3: ████████████ 2s 總時間: 2 秒 📦 httpx 非同步客戶端 基本用法 import httpx import asyncio async def fetch_single(): """單一請求""" async with httpx.AsyncClient() as client: response = await client.
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
05-5. WebSocket 基礎 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階)
🤔 一句話解釋 WebSocket 是雙向通訊協議,讓伺服器可以主動推送資料給客戶端,適合即時應用。
🔄 HTTP vs WebSocket HTTP(請求-回應模式): ┌────────┐ ┌────────┐ │ Client │ ──請求──▶│ Server │ │ │ ◀─回應── │ │ │ │ ──請求──▶│ │ │ │ ◀─回應── │ │ └────────┘ └────────┘ 每次通訊都需要新請求 WebSocket(雙向通訊): ┌────────┐ ═══════ ┌────────┐ │ Client │◀═══════▶│ Server │ │ │ 持久 │ │ │ │ 連線 │ │ └────────┘ ═══════ └────────┘ 一次握手,雙向即時通訊 🎯 使用場景 場景 說明 聊天室 即時訊息傳遞 即時通知 推播新消息 股票行情 即時價格更新 遊戲 即時狀態同步 協作編輯 多人同時編輯 📦 FastAPI WebSocket 基礎 最簡單的範例 from fastapi import FastAPI, WebSocket app = FastAPI() @app.
05-6. Server-Sent Events (SSE) ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (進階)
🤔 一句話解釋 Server-Sent Events (SSE) 是伺服器單向推送資料給客戶端的技術,比 WebSocket 更簡單,適合即時通知場景。
🔄 WebSocket vs SSE WebSocket(雙向通訊): ┌────────┐ ◀═══════▶ ┌────────┐ │ Client │ 雙向 │ Server │ └────────┘ └────────┘ 客戶端和伺服器都可以主動發送 SSE(單向推送): ┌────────┐ ◀──────── ┌────────┐ │ Client │ 單向 │ Server │ └────────┘ └────────┘ 只有伺服器可以推送比較表 特性 WebSocket SSE 方向 雙向 單向(伺服器 → 客戶端) 協議 ws:// http:// 複雜度 較高 較低 自動重連 需自行實作 瀏覽器內建 二進制 支援 不支援(純文字) 適用場景 聊天、遊戲 通知、即時更新 🎯 適用場景 場景 說明 即時通知 新訊息、系統警告 股票報價 價格即時更新 進度更新 檔案上傳、任務進度 社群動態 新貼文、新留言 日誌串流 即時日誌輸出 📦 FastAPI SSE 基礎 基本範例 from fastapi import FastAPI from fastapi.
05-7. 背景任務 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階)
🤔 一句話解釋 背景任務讓 API 可以快速回應,同時在背景執行耗時操作,提升使用者體驗。
🔄 為什麼需要背景任務 沒有背景任務: ┌────────┐ ┌────────┐ ┌────────┐ │ Client │ ─請求─▶ │ Server │ ─處理─▶ │ 耗時 │ │ │ ◀─回應─ │ │ ◀───── │ 作業 │ └────────┘ └────────┘ └────────┘ 用戶等待:████████████████████ 10 秒 有背景任務: ┌────────┐ ┌────────┐ ┌────────┐ │ Client │ ─請求─▶ │ Server │ ─背景─▶ │ 耗時 │ │ │ ◀─回應─ │ │ │ 作業 │ └────────┘ └────────┘ └────────┘ 用戶等待:██ 0.
05-8. 效能優化與監控 ⏱️ 閱讀時間: 20 分鐘 🎯 難度: ⭐⭐⭐⭐ (高階)
🤔 一句話解釋 效能優化和監控讓你的 API 更快、更穩定,並能及時發現和解決問題。
📊 效能監控指標 ┌─────────────────────────────────────────────────────────┐ │ 效能監控指標 │ ├──────────────┬──────────────────────────────────────────┤ │ 延遲 │ P50, P95, P99 回應時間 │ │ 吞吐量 │ 每秒請求數 (RPS) │ │ 錯誤率 │ 5xx/4xx 錯誤百分比 │ │ 可用性 │ 服務正常運行時間百分比 │ │ 資源使用 │ CPU、記憶體、連線數 │ └──────────────┴──────────────────────────────────────────┘ 🔧 請求追蹤中介層 基本追蹤 from fastapi import FastAPI, Request from starlette.middleware.base import BaseHTTPMiddleware import time import logging import uuid app = FastAPI() logger = logging.
06-1. 依賴注入基礎 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐ (中級)
🤔 一句話解釋 依賴注入(DI)是一種設計模式,讓函數的依賴由外部提供,而不是自己創建,提高程式碼的可測試性和可維護性。
🔄 沒有 DI vs 有 DI # ❌ 沒有依賴注入 def get_users(): db = Database("postgresql://localhost/db") # 硬編碼 return db.query("SELECT * FROM users") # ✅ 有依賴注入 def get_users(db: Database): # 依賴由外部提供 return db.query("SELECT * FROM users")沒有 DI: ┌────────────┐ ┌──────────────┐ │ get_users │────▶│ Database │ 內部建立 └────────────┘ └──────────────┘ 緊密耦合,難以測試 有 DI: ┌────────────┐ ┌──────────────┐ │ 外部 │────▶│ Database │ └────────────┘ └──────────────┘ │ │ └─────────────────▶│ ┌────────────┐ │ get_users │ 接收依賴 └────────────┘ 鬆散耦合,易於測試 🎯 依賴注入的好處 好處 說明 可測試性 可以注入 mock 物件進行測試 可維護性 依賴關係清晰,易於修改 可重用性 相同的依賴可以在多處使用 鬆散耦合 組件之間不直接相依 📦 FastAPI 依賴注入 基本用法 from fastapi import FastAPI, Depends app = FastAPI() # 定義依賴函數 def common_parameters(q: str = None, skip: int = 0, limit: int = 100): return {"q": q, "skip": skip, "limit": limit} # 使用依賴 @app.