KB-5D49
resilient caller standard
2 min read Revision 1
Playbook: Resilient Caller Standard
Mục đích
Tiêu chuẩn bắt buộc cho mọi cuộc gọi đến Cloud Run services và external APIs.
Cấu hình tiêu chuẩn
| Tham số | Giá trị | Lý do |
|---|---|---|
| Max retries | 3 | Đủ cho cold start (~5-8s) |
| Backoff | 1s, 2s, 4s (exponential) | Cho Cloud Run warm up |
| Client timeout | 30s | Cold start có thể mất 10-15s |
| Startup timeout | 60s | Init Qdrant connection lâu hơn |
| Retry conditions | timeout, 503, 504, ConnectionError | Chỉ transient errors |
Kiến trúc 2 tầng
Tầng 1 — Server-side (trong Cloud Run)
- Module:
agent_data/resilient_client.py - ResilientCaller class: async httpx + tenacity
- sync_retry decorator: wrap Qdrant/OpenAI SDK calls
- Startup probes: verify connections trước khi nhận traffic
- /health endpoint: chi tiết per-service status
Tầng 2 — Client-side (phía gọi)
- Nuxt: ofetch built-in retry (
$fetch('/api/data', { retry: 3 })) - Python scripts:
scripts/utils/resilient_fetch.py - Directus Flows: cấu hình retry trong Request Node
Phonebook Pattern
- KHÔNG hardcode URLs — đọc từ env vars
- Convention:
SERVICE_{NAME}_URLcho auto-discovery - Backward compat:
QDRANT_URL,OPENAI_API_URLvẫn hoạt động - Thêm service mới = thêm 1 env var, không sửa code
Startup Probe (Cloud Run)
--startup-probe-path="/health"
--startup-probe-period=5
--startup-probe-failure-threshold=12
Container KHÔNG nhận traffic cho đến khi /health OK.
Áp dụng
- BẮT BUỘC cho mọi Cloud Run service (hiện tại và tương lai)
- BẮT BUỘC async-only (httpx, không requests)
- BẮT BUỘC dùng tenacity (không tự viết retry logic)
Ngày hiệu lực
2026-02-08, phê duyệt bởi User + Claude + Gemini