← 返回項目列表
業務服務

設定與存取控制服務

租戶設定、網域管理與依優先順序的允許/拒絕引擎

初版作者 · 重構規則引擎 · 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 的一致性。