主题
XHIM 容量、SLO 与灾备基线
纯 IM 首发不包含实时音视频;标记“可选通话包”的容量、SLO 和故障演练只在 独立 RTC 厂商扩展发布时启用,不阻塞纯 IM Stable。
1. 建议 SLO
SLO 必须基于客户部署实测后冻结,以下是首个商用环境的建议目标:
| 指标 | 建议目标 |
|---|---|
| Session/Sync/Send API 月可用性 | 99.95% |
| 发送提交延迟 | p95 < 300 ms,p99 < 1 s(同地域,不含客户端网络) |
| Sync 增量延迟 | p95 < 2 s |
| Push 入 Provider 延迟 | p95 < 5 s |
| (可选通话包)通话邀请信令延迟 | p95 < 500 ms |
| PostgreSQL 数据 RPO | ≤ 5 分钟 |
| 核心服务 RTO | ≤ 30 分钟 |
| 对象媒体 RPO | 按 Bucket 跨区复制策略 |
错误预算必须排除计划维护的条件与客户责任边界写入商业协议,不能只在仪表盘 临时定义。
2. 容量模型
发布前按以下输入计算并压测:
- DAU、峰值在线连接、每用户设备数;
- 峰值消息/秒、平均/最大 Payload、群扇出分布;
- 每账号事件积压、离线天数和同步分页大小;
- Push 设备数、通知/秒、Provider 429/5xx 比例;
- 媒体上传/下载带宽、对象大小分布、并发分片;
- (可选通话包)同时通话房间、参与者、音视频码率、TURN 比例;
- 审计/信令保留时长及索引增长。
任何宣传的“百万连接”“十万群”或吞吐数字都必须附硬件、拓扑、数据模型、 压测脚本、持续时间、p50/p95/p99、错误率和瓶颈说明。
3. 扩缩容与背压
- API 为无状态副本;会话 Hint 使用 PostgreSQL
LISTEN/NOTIFY或生产消息总线; - PostgreSQL 连接池总量不得超过数据库安全上限,扩容 API 时同步核算连接;
- WebSocket、请求体、分页、Actor、Callback、Push/Media Worker 全部有界;
- 429/
Retry-After进入受控退避,不用无限重试放大故障; - Push 和媒体任务使用持久 Outbox/Lease,副本崩溃后由新 Worker 接管;
- 数据库或 Provider 降级时优先保护登录、发送提交和 Sync,不让批处理耗尽资源。
4. 备份与恢复
生产要求:
- PostgreSQL 每日全量备份 + 连续 WAL/PITR,备份跨故障域保存并加密;
- S3/兼容对象存储开启版本、生命周期、KMS 和需要时的跨区复制;
- 服务端签名、Cursor 和媒体密钥由 KMS/Secret Manager 备份并独立轮换;
- (可选通话包)RTC Token/房间签名密钥使用独立 KMS Key 和轮换周期;
- 配置、迁移版本、镜像 Digest、SBOM、签名和发布清单可重建;
- 每季度执行隔离环境恢复演练并记录实际 RPO/RTO;
- 恢复时先验证 Schema/租户隔离/对象可读,再逐步开放写流量和 WebSocket。
禁止把数据库备份是否存在等同于可恢复。演练必须包含误删、区域不可用、密钥 失效、坏迁移、Push Provider 故障和版本回滚;独立发布通话包时再加入 RTC Provider 故障。
XHIM PostgreSQL 的逻辑备份、Hash/custom TOC 校验、隔离空库恢复演练、 N/N-1 滚动升级和应用回滚门禁使用 server/scripts/postgres。该工具链不会 drop 或向后迁移在线 Schema;恢复时 Hash、TOC 和导入固定使用同一匿名 FD 快照,源 dump 被原子替换也不能改变本次输入。逻辑备份仍不能替代连续 WAL/PITR。
5. 故障演练
- 杀死任意 API/Push Worker,确认租约恢复且无重复业务副作用;
- PostgreSQL 主库切换,验证连接重建、幂等和 Cursor 连续性;
- 对象存储 429/5xx/超时,验证媒体任务保留并按
Retry-After恢复; - (可选通话包)RTC Provider 不可用,信令明确失败而不是假 Active;
- WSS 大规模断连,验证退避抖动并避免同步风暴;
- 恢复旧备份后,确认迁移前向执行和客户端旧事件去重。
压测入口见 server/load/README.md。