主题
XHIM 数据生命周期与存储治理
基本原则
- 服务端保留权威聊天记录,不能由普通后台定时任务误删;
- 客户端本地数据库是加密投影,断线可读且能按企业策略控制本地占用;
- 原始媒体进对象存储,数据库只保存 MediaRef、Hash、尺寸和状态;
- 临时上传分片、失败任务、过期授权、过期 Presence/Typing 和可重生 Thumbnail/Cache 可以自动清理;
- 每一类自动清理都要有单独的指标、审计和 Dry Run,禁止用一条宽泛 SQL “清理旧数据”。
数据分类
| 数据 | 默认所有者 | 是否可自动删除 | 备注 |
|---|---|---|---|
| 聊天消息与撤回/编辑历史 | PostgreSQL | 否 | 只由明确保留政策或用户操作改变可见性 |
| 会话、已读、好友、群组、部门 | PostgreSQL | 否 | 权威状态 |
| 媒体原文 | S3/对象存储 | 有条件 | 先证明无消息引用,再经延迟删除队列 |
| 上传分片和未完成对象 | 对象存储 | 是 | 超时、无引用、无活跃租约时删除 |
| Push/Webhook Outbox | PostgreSQL | 是 | 已成功或 Dead Letter 达到审计期后归档/清理 |
| Presence/Typing | PostgreSQL/内存 | 是 | TTL 过期即清理 |
| 本地 SQLCipher 投影 | 终端 | 是 | 受用户/企业本地保留策略管理 |
| 本地媒体缓存/缩略图 | 终端 | 是 | LRU + 容量上限 + 低存储压力通知 |
前端“聊天记录保留”的正确语义
前端可选 1 周 / 1 个月 / 半年 / 1 年 / 永久,但要区分两种策略:
- 本地保留:只限制 SQLCipher 投影与媒体 Cache,服务端权威历史不删;
- 合规保留:由企业管理员在服务端制定,需要法务依据、冻结期、审批、 归档、可恢复备份和审计记录。
当前 C++ Core 已支持 Inbox Event 数量上限和媒体缓存隔离,但还没有对外 暴露“按时间删除本地消息投影”的安全 API。在该 API 完成之前,iOS Demo 不放一个无效的选项欺骗用户。后续实现必须保证:
- 只删已经服务器接受且不在 Outbox/上传/撤回等待中的本地行;
- 同一事务修正会话摘要、未读数、搜索索引、引用依赖和媒体引用计数;
- 向上翻页不会无限重新下载超出本地保留线的历史;
- 修改策略可取消、可观测,空闲时分批执行,不阻塞 UI 或破坏最新消息定位。
服务端定时治理作业
每个清理 Worker 必须采用有上限分页、租约、重试、幂等和指标。建议默认周期:
- 过期 Presence/Typing:按 TTL 秒级扫描;
- 未完成上传:24 小时无活跃租约后进 Quarantine,再延迟 7 天删除;
- 已成功 Push/Webhook Outbox:保留 30 天后归档;
- Dead Letter:默认保留 180 天,必须可检索且可重放;
- 无引用媒体:只从消息引用计数归零、法务冻结为空且 Quarantine 到期后删除。
上述是交付策略,不是当前全部 Worker 已完成的声明。每个客户环境应在 容量报告中记录已启用 Worker 及实际保留期。