Cell 温度管理
wesgine Cell 温度状态:Hot / Warm / Cool / Cold 四态及自动转换。
四种温度
| 温度 | 含义 | 激活成本 |
|---|---|---|
| Hot | 有活跃 Run | 0 |
| Warm | goroutine/DB 在内存 | 0 |
| Cool | 磁盘保留,无 goroutine | 100-500ms |
| Cold | Stopped | 1-3s |
状态转换
Hot → Warm Run 结束
Warm → Cool idle 15min
Cool → Cold idle N 天(可配置)
外设保持 Warm
需要 Warm 的外设:
- Cron:定时任务调度器需要 goroutine
- IMAP:邮件轮询需要 goroutine
当 Cell 有活跃 Cron 或 IMAP 时,Cell 无法降温到 Cool。
Cool 态行为
首请求自动 WarmUp
Cool 态 Cell 收到第一个请求时:
- Gateway 中间件检测到 Cool 状态
- 同步执行 WarmUp
- 请求继续处理
100-500ms 预算
WarmUp 需要:
- 打开 DB 连接
- 恢复内存状态
- 启动必要 goroutine
Cold 态行为
Gateway 返回 503
Cold 态 Cell 收到请求时:
HTTP 503 Service Unavailable
Retry-After: 5
同时后台异步唤醒 Cell。
SDK 路径
SDK 路径对 Cold 态同步唤醒,不返回 503。
温度调度器
Hypervisor 运行温度调度器,管理所有 Cell 的温度转换。
调度逻辑
// 伪代码
for _, cell := range allCells {
if cell.IdleDuration() > coolThreshold && cell.CanCool() {
cell.Cool()
}
if cell.IdleDuration() > coldThreshold {
cell.Stop()
}
}
CanCool 判断
Cell 满足以下条件才可 Cool:
- 无活跃 Run
- 无 Cron 任务
- 无 IMAP 轮询
- 无 Plugin 进程
INV-SERVE-REACHABLE-01
wesgine serve 到达"可被探活"所需的时间是有界常数。
router.Start(绑端口)→ sdnotify.Ready() → ActivatePersisted(后台)
ActivatePersisted在Ready之后- 热身可被取消(SIGTERM 时停止)
- 跳过热身不损失正确性
未被热身的 Cell:
- Cool 态首请求同步 WarmUp
- Cold 态返回 503 + Retry-After
代价:Cron/IMAP 推迟到下次热身才恢复。
IMAP 计数(imapWarmnessCount)
IMAP 收信注册与温度判断一律读存储,不读声明。
- 读声明会让 UI 新增的账号重启后收不到信
- 计数 0 时把正在轮询的 Cell 判成 Cool 并抽掉 goroutine
- 仅探测失败时退回声明作估计(偏多 = 钉住 Warm,安全一侧)
相关文档
- Cell 生命周期 →
cell-lifecycle.md - CellSpec 总览 →
cellspec-overview.md - Cron 系统 →
cron-system.md