在 DSH 的 projection 開發中,大會話的冷摺疊(Cold Fold)處理是性能瓶頸。DSH 0.1.0-rc.6 版本中,SessionProjectionRegistry.cellFor() 在 cell 冷時會對整個 session.events 逐事件 apply()。實測 74 萬事件會話的冷摺疊會阻塞 20 分鐘以上,導致 Node 事件循環凍結,所有 unary RPC 超時(30s),前端表現爲 signal timed out。
DSH projection warmup 插件通過 live session chunked warmup 和 fork cache backfill 機制,消除上述事件循環阻塞。
核心功能¶
該插件提供以下能力:
- 分片預熱:針對超過閾值的事件分片重放 cells。會話進入(created/resume)且事件數超過閾值時,搶在首次同步冷摺疊前,每
chunkSize個事件通過setImmediate讓出事件循環,摺疊完成後直寫registration.cells(WeakMap)。 - Fork 子會話緩存回填:建立投影緩存行。fork 子會話(
header.parentSession存在)預熱完成後立即cache.write(child),否則該會話被放棄時永遠沒有緩存行,下次打開歷史coldSnapshot會走readFrom(0)全量讀。 - 磁盤冷會話後臺補行:掃描缺緩存行的大日誌,流式 parse + fold 後
putSoft寫行。 - API 支持:提供統計與配置 API。
安裝¶
使用官方安裝命令添加插件:
dsh plugin --profile web add github:orangeofcarl0-sys/dsh-projection-warmup
典型用法¶
插件提供 HTTP API 用於查詢狀態與配置:
# 統計與重置
POST http://127.0.0.1:3080/dsh-projection-warmup/api/stats/get
POST http://127.0.0.1:3080/dsh-projection-warmup/api/stats/reset
# 配置獲取與設置
POST http://127.0.0.1:3080/dsh-projection-warmup/api/config/get
POST http://127.0.0.1:3080/dsh-projection-warmup/api/config/set
開啓磁盤冷會話後臺補行功能時,需調用配置接口:
{
"key": "diskBackfill.enabled",
"value": true
}
適用場景與注意¶
插件運行在當前 DSH 進程權限下,安裝前應檢查源碼與許可證。
已知侷限:
- 同步解碼限制:冷會話全量
readFrom(0)中的同步解碼(zstd)無法在插件層安全分片,對大文件仍會凍結事件循環數秒至數十秒。 - 內存風險:超大會話(70萬+事件)加載本身有內存 OOM 風險;啓動期補行與 dsh 自身的啓動投影摺疊疊加會推高內存峯值。
- 兼容性:默認開啓 live 會話分片預熱與 fork 子會話緩存回填;磁盤冷會話後臺補行默認關閉,需按需開啓。
總結¶
該插件將大會話的冷摺疊時間從分鐘級降低至毫秒級。通過分片與回填機制,顯著減少歷史加載與 UI 操作的超時概率。更多詳情可參考 GitHub 倉庫。