Files
DashBoard/openspec/specs/health-check/spec.md
beabigegg 3234c7088a feat: 導入 Redis 快取層與 Worker 穩定性強化
- 新增 Redis 表級快取機制,減少 Oracle 查詢負載
- 實作 CacheUpdater 背景任務,每 10 分鐘檢查 SYS_DATE 並更新快取
- 所有 WIP API 端點改為 cache-first + Oracle fallback 架構
- 新增 /health 端點顯示資料庫、Redis、快取狀態
- 前端 Portal 新增即時健康狀態指示器
- SQLAlchemy 連線設置 call_timeout=55s 防止 Worker 卡死
- Gunicorn 加入 max_requests=1000 確保 Worker 定期重啟
- 完整測試覆蓋:67 項單元/整合/E2E 測試

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:38:30 +08:00

3.3 KiB
Raw Blame History

ADDED Requirements

Requirement: Health Check Endpoint

系統 SHALL 提供 /health 端點,回報服務健康狀態。

Scenario: All services healthy

  • WHEN 呼叫 GET /health 且 Oracle 和 Redis 都正常
  • THEN 系統 SHALL 回傳 HTTP 200
  • AND 回應 body 為:
    {
      "status": "healthy",
      "services": {
        "database": "ok",
        "redis": "ok"
      }
    }
    

Scenario: Database unhealthy

  • WHEN 呼叫 GET /health 且 Oracle 連線失敗
  • THEN 系統 SHALL 回傳 HTTP 503
  • AND 回應 body 包含:
    {
      "status": "unhealthy",
      "services": {
        "database": "error",
        "redis": "ok"
      },
      "errors": ["Database connection failed: <error message>"]
    }
    

Scenario: Redis unhealthy but service degraded

  • WHEN 呼叫 GET /health 且 Redis 連線失敗但 Oracle 正常
  • THEN 系統 SHALL 回傳 HTTP 200因為可降級運作
  • AND 回應 body 包含:
    {
      "status": "degraded",
      "services": {
        "database": "ok",
        "redis": "error"
      },
      "warnings": ["Redis unavailable, running in fallback mode"]
    }
    

Scenario: Redis disabled

  • WHEN 呼叫 GET /healthREDIS_ENABLED=false
  • THEN 回應 body 的 services.redis SHALL 為 "disabled"

Requirement: Database Health Check

健康檢查 SHALL 驗證 Oracle 資料庫連線。

Scenario: Database ping succeeds

  • WHEN 執行資料庫健康檢查
  • THEN 系統 SHALL 執行 SELECT 1 FROM DUAL
  • AND 查詢成功則標記 database 為 ok

Scenario: Database ping timeout

  • WHEN 資料庫查詢超過 5 秒
  • THEN 系統 SHALL 標記 database 為 error
  • AND 記錄超時錯誤

Requirement: Redis Health Check

健康檢查 SHALL 驗證 Redis 連線(當 REDIS_ENABLED=true 時)。

Scenario: Redis ping succeeds

  • WHEN 執行 Redis 健康檢查
  • THEN 系統 SHALL 執行 Redis PING 命令
  • AND 收到 PONG 回應則標記 redis 為 ok

Scenario: Redis ping fails

  • WHEN Redis PING 命令失敗或超時
  • THEN 系統 SHALL 標記 redis 為 error
  • AND 服務狀態 SHALL 為 degraded(非 unhealthy

Requirement: Cache Status in Health Check

健康檢查 SHALL 包含快取狀態資訊。

Scenario: Cache status included

  • WHEN 呼叫 GET /health 且快取可用
  • THEN 回應 body SHALL 包含 cache 區塊:
    {
      "cache": {
        "enabled": true,
        "sys_date": "2024-01-15 10:30:00",
        "updated_at": "2024-01-15 10:35:22"
      }
    }
    

Scenario: Cache not populated

  • WHEN 呼叫 GET /health 且 Redis 可用但快取尚未載入
  • THEN 回應 body 的 cache.sys_date SHALL 為 null

Requirement: Health Check Performance

健康檢查 SHALL 快速回應,不影響服務效能。

Scenario: Response within timeout

  • WHEN 呼叫 GET /health
  • THEN 系統 SHALL 在 10 秒內回應
  • AND 各項檢查的超時時間 SHALL 不超過 5 秒

Scenario: No authentication required

  • WHEN 呼叫 GET /health
  • THEN 系統 SHALL 不要求身份驗證
  • AND 不記錄到存取日誌(避免日誌污染)