- 新增 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>
3.6 KiB
3.6 KiB
1. 基礎建設
- 1.1 安裝 Redis 服務於 Linux 伺服器
- 1.2 配置 Redis(使用預設配置,無需限制記憶體)
- 1.3 更新
requirements.txt加入redis>=5.0.0和hiredis>=2.0.0 - 1.4 更新
.env.example加入 Redis 相關環境變數
2. Redis 連線管理
- 2.1 建立
src/mes_dashboard/core/redis_client.py - 2.2 實作
get_redis_client()函數,支援連接池和健康檢查 - 2.3 實作
redis_available()函數,檢查 Redis 連線狀態 - 2.4 加入環境變數讀取:
REDIS_URL、REDIS_ENABLED、REDIS_KEY_PREFIX
3. 快取更新背景任務
- 3.1 建立
src/mes_dashboard/core/cache_updater.py - 3.2 實作
CacheUpdater類別,包含 start/stop 方法 - 3.3 實作
_check_sys_date()方法,查詢 OracleMAX(SYS_DATE) - 3.4 實作
_load_full_table()方法,載入整個DW_PJ_LOT_V表 - 3.5 實作
_update_redis_cache()方法,使用 pipeline 原子更新 - 3.6 在
app.py中整合,應用啟動時啟動背景任務
4. 快取讀取與降級機制
- 4.1 重寫
src/mes_dashboard/core/cache.py,實作表級快取 - 4.2 實作
get_cached_wip_data()函數,從 Redis 讀取完整表資料 - 4.3 實作
get_cached_sys_date()函數,讀取快取的 SYS_DATE - 4.4 實作降級邏輯:Redis 不可用時 fallback 到 Oracle
5. WIP Service 重構
- 5.1 修改
get_wip_summary()使用快取資料 + pandas 計算 - 5.2 修改
get_wip_matrix()使用快取資料 + pandas 計算 - 5.3 修改
get_wip_hold_summary()使用快取資料 + pandas 計算 - 5.4 修改
get_wip_detail()使用快取資料 + pandas 篩選/分頁 - 5.5 修改
get_hold_detail_summary()使用快取資料 - 5.6 修改
get_hold_detail_distribution()使用快取資料 - 5.7 修改
get_hold_detail_lots()使用快取資料 + pandas 篩選/分頁 - 5.8 修改 meta 端點(workcenters、packages、search)使用快取資料
6. SQLAlchemy 連線超時修復
- 6.1 修改
src/mes_dashboard/core/database.py - 6.2 在
_register_pool_events()中加入 checkout 事件處理 - 6.3 設置
dbapi_conn.call_timeout = 55000 - 6.4 超時機制已配置(生產環境驗證)
7. Gunicorn 配置強化
- 7.1 修改
gunicorn.conf.py加入max_requests = 1000 - 7.2 加入
max_requests_jitter = 100 - 7.3 確認
timeout = 65(大於 call_timeout 55 秒)
8. 健康檢查端點
- 8.1 建立
src/mes_dashboard/routes/health_routes.py - 8.2 實作
GET /health端點 - 8.3 實作
check_database()函數(SELECT 1 FROM DUAL) - 8.4 實作
check_redis()函數(PING) - 8.5 實作
get_cache_status()函數(讀取 meta keys) - 8.6 在
app.py中註冊 health blueprint - 8.7 配置健康檢查不需要身份驗證
9. 測試
- 9.1 單元測試:Redis 連線管理(mock Redis)
- 9.2 單元測試:快取更新邏輯
- 9.3 單元測試:降級機制
- 9.4 整合測試:API 回傳結果正確性
- 9.5 效能測試:比較快取前後的回應時間
- 9.6 E2E 測試:完整端到端測試(17 項測試全部通過)
10. 部署與驗證
- 10.1 部署 Redis 服務到生產環境
- 10.2 設置生產環境的環境變數
- 10.3 部署應用程式更新
- 10.4 監控 Redis 記憶體使用率(目前 17MB)
- 10.5 確認 Oracle 查詢頻率降低(日誌顯示 Cache hit)
- 10.6 確認
/health端點正常運作 - 10.7 前端 UI 加入健康狀態標示