上线检查清单:IM 系统自检项
这份清单覆盖整套 IM 教程的落点,按七个维度组织:协议与模型、连接与网关、投递与可靠性、群聊、存储与扩容、安全、观测与演练。每一项都给出要点与可执行的验收口径,打勾前必须先跑出证据(压测报告、演练记录、用例结果),不接受“已经实现了”这类口头确认。
协议与模型
| 检查项 | 要点 | 验收口径 |
|---|
| 帧格式定版 | 长度前缀 + 版本号 + 消息类型 + 序列号,字段只增不改不删 | 新旧客户端双向兼容用例通过,未知字段被忽略而不是报错 |
| 消息 ID | 全局唯一且趋势递增,不依赖数据库自增 | 抽样 100 万条无重复;同会话内 ID 严格递增 |
| 会话序列号 | 接收端可检测序号空洞并触发补拉 | 注入丢包后无残留空洞,补拉后位点连续 |
| 错误码表 | 区分可重试与不可重试,含义稳定不随版本变化 | 错误码文档与代码一致,客户端按码决策的用例覆盖 |
| 幂等键 | client_msg_id 由客户端生成并保证唯一 | 重复发送返回同一个 msgID,服务端只产生一条消息 |
| 时间口径 | 时间戳统一用服务端毫秒时间,客户端时间只做展示 | 跨时区设备的消息排序与显示一致性用例通过 |
| 版本灰度 | 协议变更走灰度,老版本在灰度期功能可用 | 灰度期间老版本客户端收发成功率无下降 |
连接与网关
| 检查项 | 要点 | 验收口径 |
|---|
| 心跳与离线判定 | 心跳 30s、服务端 90s 未收到即判定离线 | 弱网与休眠场景误判率 < 0.1%,不出现“在线却收不到” |
| 鉴权与续期 | token 有效期、续期路径与续期失败后的降级路径明确 | 续期失败可平滑转为重新登录,不掉消息、不重复提示 |
| 单机连接水位 | 达到设计值的 70% 触发扩容,内存与 fd 在预算内 | 压测报表给出单机连接拐点与当时的 CPU/内存占用 |
| 内核与 fd 参数 | ulimit、somaxconn、端口范围随镜像或初始化脚本固化 | 新机器上线即生效,无人工调参;ListenOverflows 为 0 |
| 建连限速与退避 | 客户端重连退避带抖动,服务端限制单 IP 建连速率 | 制造断网恢复后建连速率不超设计值 3 倍 |
| 慢客户端保护 | 写缓冲设硬上限,超限断开并单独计数 | 模拟只连不读的客户端,单机内存不异常增长 |
| 多端登录策略 | 同账号多设备上限与踢人规则明确 | 被踢端有明确提示,重新登录后历史与未读完整 |
| 网关发布 | 支持分批重启或连接迁移 | 单批发布期间掉线率 < 0.5%,无消息丢失 |
投递与可靠性
| 检查项 | 要点 | 验收口径 |
|---|
| ACK 语义 | ACK 表示已落库,不代表对端已读 | 客户端实现与文档一致,弱网下不出现重发风暴 |
| 重发与去重 | 发送端超时重发,接收端按 msgID 去重 | 刻意重复投递,用户侧不可见重复消息 |
| 顺序性 | 单会话内乱序自动重排或明确拒绝 | 乱序率有指标与告警,人为乱序可被纠正 |
| 离线补拉 | 上线按位点补拉,位点推进幂等 | 补拉完整率 100%,重复拉取不重复入库 |
| 多端同步 | 已读、撤回、编辑在多端表现一致 | 三端并发操作的同步用例通过,无状态回退 |
| 落库成功率 | 目标 ≥ 99.99%,失败有可重入的补偿任务 | 补偿任务演练一次可从缺口恢复到一致 |
| 撤回与编辑边界 | 时限、已读后能否撤回、撤回后的多端表现写清 | 边界用例全部覆盖,撤回后客户端不再展示正文 |
| 推送与补拉配合 | 离线推送与上线补拉不重复打扰 | 收到推送后进入会话,不出现重复未读提醒 |
群聊
| 检查项 | 要点 | 验收口径 |
|---|
| 群规模分档 | 按规模分档(写扩散/读扩散/广播加拉取),阈值有压测依据 | 各档群在目标延迟与存储预算内,跨档切换有迁移方案 |
| 成员变更一致性 | 入群补历史、退群停投递、被踢立即生效 | 变更生效时间 < 1 分钟,无“退群后仍收消息”用例 |
| 权限模型 | 群主、管理员、成员的操作权限矩阵明确 | 权限用例全覆盖,越权操作返回明确错误码 |
| 大群限流与合并 | 单群下行速率上限与消息合并窗口生效 | 热点群压测不拖垮共享集群,有独立配额或独立部署 |
| 未读数与摘要 | 未读数与最后一条摘要可低成本获得 | 群列表首页 P99 在预算内,不出现 N 次聚合查询 |
| 群消息幂等 | 同一 client_msg_id 在群内只产生一条消息 | 并发重复提交用例通过 |
| 解散与归档 | 解散后可读不可发,归档数据访问权限明确 | 解散群的历史查询与权限用例通过 |
存储与扩容
| 检查项 | 要点 | 验收口径 |
|---|
| 分片键与路由 | 分片键选 uid,路由函数有单测 | 跨分片查询清单化且有数量上限,新增查询需评审 |
| 单表水位 | 单表行数与磁盘水位阈值明确 | 超阈值前完成归档或扩容,不出现临时紧急扩容 |
| 冷热分离 | 热数据在线、冷数据归档,归档任务可回放 | 归档后冷数据查询可用,回放校验通过 |
| 备份与恢复 | 备份周期与保留时长明确,做过真实恢复 | 有一次恢复演练记录,含耗时与数据校验结果 |
| 在线迁移 | 双写、校验、回滚步骤齐全 | 迁移演练完成,切换窗口与回滚耗时已量化 |
| 副本与切换 | 主从或多副本配置明确,切换演练过 | 切换演练中应用自动重连,无脏读导致的可见错误 |
| 保留与合规 | 消息保留期与删除策略符合合规要求 | 注销用户的数据处理路径明确且可验证 |
安全
| 检查项 | 要点 | 验收口径 |
|---|
| 鉴权与越权 | 拉取会话与历史都校验成员关系 | 横向越权用例全部被拦截,含 ID 遍历场景 |
| 频控与风控 | 单用户上行、单 IP 建连、登录失败次数均有阈值 | 阈值可配置,压测与脚本攻击场景触发限流且不影响正常用户 |
| 防重放 | 关键接口带时间戳与随机数 | 重放窗口外的请求被拒,窗口内重放被去重 |
| 内容安全 | 先审后发或先发后审的边界明确 | 审核、撤回、封禁链路可用,且与降级预案衔接 |
| 敏感数据 | 日志不落明文消息与手机号,传输全程 TLS | 抽样日志无敏感字段;存储侧敏感字段加密 |
| 客户端存储 | 本地消息库加密,注销后清理明确 | 卸载与注销两条路径的清理用例通过 |
| 三方依赖 | SDK 与厂商推送按最小权限接入,密钥可轮换 | 密钥轮换演练一次,业务无中断 |
观测与演练
| 检查项 | 要点 | 验收口径 |
|---|
| 核心看板 | CCU、建连速率、上下行 QPS、P99、送达率、离线位点延迟 | 看板齐全且口径与文档一致,能按机房与实例下钻 |
| 告警可行动 | 每类告警有阈值、影响面说明与处置手册 | 无重复告警;每条告警都能指向一个动作 |
| 链路追踪 | 一条消息可用 msgID 串起全链路 | 抽样 10 条消息可完整还原上行、路由、下行与落库耗时 |
| 日志规范 | 关键节点结构化日志带 traceID | 日志量在磁盘预算内,采样策略明确 |
| 水位预警 | 连接、内存、磁盘、MQ 积压均有预警与严重两档 | 预警档在严重档之前触发,且有历史命中记录 |
| 预案演练 | 降级与容灾预案至少演练一遍 | 有演练记录与量化判据,未通过项已闭环 |
| 上线前压测 | 压测测试项全部达标并附拐点证据 | 压测报告包含环境、方法、曲线与瓶颈证据 |
| 回滚方案 | 版本回滚与数据回滚的步骤、耗时、验证方式明确 | 回滚演练一次,恢复时间与预期一致 |
使用方式
- 分三档判定:阻塞上线(任何一项不通过,或口径无法给出证据)、限期整改(不影响正确性,一周内闭环)、可选优化(记入技术债看板)。
- 每次上线由作者之外的人抽查 20% 的条目,防止“自评自过”;抽查记录与结果一并归档。
- 清单每季度回归一次,把新出现的故障与演练发现的问题补成新条目,删除已经不再适用的条目。
- 涉及线上开关的条目(降级、限流、灰度)必须能在演练环境复现,只写文档不算通过。
小结:这份清单把前面 29 章的可验收点收拢成七组自检项——协议与模型保证兼容与唯一性,连接与网关保证掉线可控,投递与可靠性保证不丢不重不乱,群聊保证分档与成员一致性,存储与扩容保证水位与可迁移,安全保证越权与合规边界,观测与演练保证出问题时能发现、能止血、能回滚。上线前逐项拿到证据,IM 系统的第一道防线才算立住。