面對論壇核心資料表 (主題、用戶) 突破千萬筆的挑戰,Discuz!NT 企業版採用「關係型資料庫 + NoSQL 雙引擎」架構:MSSQL 維持交易一致性與複雜查詢,Tokyo Cabinet (Tokyo Tyrant) 與 MongoDB 分別承擔高併發讀取與彈性文件儲存。本文深度剖析選型邏輯、介面設計、部署考量與風險控管策略。
| 維度 | Tokyo Cabinet (Tokyo Tyrant) | MongoDB |
|---|---|---|
| 定位 | 高效能 Key-Value 存儲,極致讀取速度 | 文件型資料庫,豐富查詢、索引、聚合 |
| 讀寫比適配 | 本專案讀寫比 4:1,**併發讀極強** | 讀寫均衡優異,彈性 Schema 適合異構資料 |
| 跨平台 | Linux/Windows 均支援 | Linux/Windows/macOS 原生支援 |
| 資源效率 | 低記憶體、CPU 即達高吞吐 | 較重,但功能豐富 |
| 角色定位 | 「高級 Memcached」:熱點資料、Session、計數器 | 輔助儲存:日誌、動態屬性、非結構化內容 |
public interface INoSqlProvider
{
// 基礎 CRUD
bool Set(string key, byte[] value, TimeSpan? expiry = null);
byte[] Get(string key);
bool Remove(string key);
bool Exists(string key);
// 批次操作
Dictionary GetMultiple(IEnumerable keys);
void SetMultiple(IDictionary items, TimeSpan? expiry = null);
// 進階 (視實作而定)
long Increment(string key, long delta);
IEnumerable Keys(string pattern);
}
實作類別:TokyoTyrantProvider、MongoDbProvider,透過 DI 容器註冊,配置檔切換:
<add key="NoSqlProvider" value="TokyoTyrant" /> <!-- 或 MongoDB -->
Increment,避免資料庫熱點行鎖。
Discuz!NT 的雙引擎策略展示了「關係型做交易、NoSQL 做高併發讀寫與彈性資料」的務實架構哲學。統一介面、漸進遷移、嚴格考核,讓技術創新在可控風險下落地。對於面臨相似規模挑戰的團隊,此案例極具參考價值。