在 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 仓库。