← 返回項目列表
業務服務
設定與存取控制服務
租戶設定、網域管理與依優先順序的允許/拒絕引擎
初版作者 · 重構規則引擎 · 2024.03 — 2026.06
Go go-zero gRPC MySQL/GORM Redis Kafka
項目概述
平台與租戶設定:網域、橫幅、版本、租戶設定與存取規則。我寫出第一版,將其拆分為獨立服務(拆分時共 42 個 RPC),並在 2025 年把存取控制規則重構為單一引擎。
架構設計
閘道中介軟體 → 設定 gRPC 服務 → 規則引擎(依帳號、暱稱或 IP 的允許清單優先;拒絕規則同時比對帳號、暱稱、IP、IP 所在地與銀行卡)→ 各租戶的 Redis hash → 未命中時查詢 MySQL。
核心技術亮點
01
將兩套舊有的允許/拒絕清單整併為一個依優先順序、支援 5 個比對維度的引擎;規則無法載入時拒絕存取
02
規則由各租戶具 TTL 的 Redis hash 提供,資料庫回源受 singleflight 保護
03
以一次性 SQL 遷移將既有規則移入新資料表(CSV → JSON 陣列)
04
租戶網域管理:連結驗證、以 Redis set 支撐的唯一性檢查,以及手動快取重新同步
05
依內容類別指定橫幅的顯示對象,並透過 Kafka 變更事件通知已連線的用戶端
核心實現
1
統一規則引擎
一張具動作與優先順序的規則表,每次請求在記憶體中正規化並評估,回傳命中的維度以供記錄。
Why: 兩套清單各有程式路徑,在邊界情況下結果不一致;一個優先順序明確的引擎更容易理解,也更容易稽核。
技術決策
| 技術決策 | 選擇 | 替代方案 | 原因 |
|---|---|---|---|
| 規則快取結構 | 每個租戶一個 Redis hash,於記憶體中評估 | 每個維度值一個 Redis key | 每個租戶的規則集都很小;每個租戶讀取一次較簡單,也不必維護大量索引 key 的一致性。 |