還記得前幾天那個每天都要去找 Microsoft 要 Token 的系統嗎?每發一次通知就要再跑一次 OAuth,就像每天都要去報戶口一樣累。
今天,這段痛苦的日子結束了。我終於幫系統裝上了記憶體——Redis!不只是快取,而是一個能幫你記得「誰、何時、拿過哪個 Token」的聰明大腦。
這一步就像整理倉庫。所有 migration
(001~013)都同步到 schema.sql
,並且在 init.sql
裡補上測試用的示例資料。
從此以後,開新環境不再是「跑不動」的開局。資料庫架構與代碼 100% 對齊,再也不會有「這表誰加的?」這種靈異事件。
文件要跟代碼一起呼吸。我檢查了 main.go
的所有 handler
註冊點:Billing、File、Batch 三大模組全數補齊。
接著更新了 teams-notification-api.yaml
:每個 API 都有請求 / 回應結構與 Schema,看起來終於像一份真的「API 規格書」,不是畫好看的裝飾品。
這是今天的主軸,也是整個架構升級的靈魂。
teams:token:{bot_id}:{tenant_id}:{token_type}
SETNX
避免多實例同時刷新TokenManager
抽象介面RedisTokenManager
實作類別TokenManager
這樣的架構可擴充、可測試、可觀察——完全符合企業級標準。
NotificationActor
改用 TokenManager
。ActorPool
改傳遞 TokenManager
實例。main.go
增加初始化流程。這次整合的過程就像換心手術,但病人不但沒死,還跑得更快。
覆蓋主要方法:GetConnectorToken
、GetGraphToken
、InvalidateToken
、RefreshToken
、GetBotConfig
。
模組 | 狀態 | 說明 |
---|---|---|
Server 啟動 | ✅ | 所有模組啟動完成 |
DB / Redis | ✅ | 正常連線 |
API 測試 | ✅ | 全部回應正確 |
通知發送 | ✅ | 3 筆發送,2 成功,1 pending |
隊列系統 | ✅ | 14 個任務正在處理 |
Actor Pool | ✅ | 正常並行運作 |
Token Cache | ⚠️ | 初始化成功,但 Redis 中尚無快取 key |
環境變數 | ❌ | 缺少 TEAMS_BOT_APP_PASSWORD |
雖然有兩個小缺角,但整體可以說是「九成滿分」。快取還沒觸發,是因為 Actor 尚未進入實際 Token 請求流程。
🧩 問題 | 說明 | 解法 |
---|---|---|
環境變數缺失 | 缺少 TEAMS_BOT_APP_PASSWORD ,導致 Actor 無法登入 Teams。 |
補上 .env 設定,並讓 CI pipeline 驗證。 |
Token 快取未觸發 | 因為登入沒成功,Redis 沒寫入 key。 | 修完環境變數後重新跑流程。 |
面向 | 特性 | 效果 |
---|---|---|
效能 | Token 快取 + Redis | 減少 API 延遲 |
穩定性 | 自動刷新 + SETNX | 避免多實例搶 Token |
擴充性 | Adapter 模式 | 容易替換或接第三方 |
安全性 | 環境變數 + Redis 儲存 | 不留明碼、不存記憶體 |
teams-token-cache.md
調校指南。「讓系統會記得,是讓它變聰明的第一步。」
以前的程式像金魚,三秒鐘就忘記自己拿過什麼 Token;現在的它終於變成了海豚,會記、會思考、還會提前準備。
Redis 的加入讓整個系統第一次具備「自我調節」能力,而這正是走向 自動化運維、智慧化代理(AI Ops) 的第一步。
這一天,看似只是加了快取,但在整個架構的演進路線圖上,它是一個重要的里程碑。
Day 23 收工,Token Cache 啟用成功。
Redis 正在呼吸、Actor 開始跳舞,整個系統像個剛甦醒的巨人,準備邁向自我管理的未來。
「讓機器記住,讓工程師自由。」
—— Day 23,《有記性的系統,才是好的夥伴》