数据与存储

TTL 索引与过期任务:数据“到期”不等于立刻消失

设计 expiresAt 索引、批量删除、墓碑传播与容量余量,正确向用户解释逻辑过期和物理清除之间的时间差。

把它做成生产功能之前,需要先拆开协议事实、产品承诺和运行成本,三者混在一起很容易得到错误结论。 大多数 TTL 清理是后台近似任务,不保证在截止毫秒删除。读路径必须先判断 expiresAt,确保逻辑上立即不可见,清理只负责回收空间。

数据设计需要同时说明原子写入、并发读写、版本迁移、崩溃恢复和清理策略。能成功保存一次不代表断电、空间不足或旧版本重开时仍保持一致。

落地方案的关键部件

先把下面几项写成可评审的规则,而不是散落在回调和界面判断里。规则越清楚,后续扩容、兼容和排错越少靠猜。

  • 索引以 expiresAt 为前导,worker 按主键稳定批量删除并限速;删除事件通知缓存与派生表,监控 oldest_expired_age 和 backlog。
  • 为状态写出唯一所有者、版本号和终态;任何回调只能修改自己创建的版本。
  • 上线参数必须有保守默认值、服务端上限和灰度开关,不能把浏览器传来的数字直接当作资源预算。

“TTL 索引与过期任务:数据“到期”不等于立刻消失”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。

别让错误假设进入生产

边界条件会把隐藏假设变成真实事故。弱网、刷新、并发和容量上限必须组合测试,因为单独出现时它们往往都能被重试掩盖。

  • 一次 DELETE 全部过期行会锁表、膨胀 WAL 并拖慢复制;只靠查询过滤又让磁盘持续增长直到写满。
  • 刷新或网络切换同时触发两条恢复路径,重复副作用被误当成两次真实用户操作。
  • 没有背压或配额时,慢消费者会把内存、队列长度与尾延迟一起推高,最后拖累无关用户。

发布闸门应该检查什么

测试不能以“最后成功了”结束。还要测量经历了多少次副作用、等待多久、是否泄露内容,以及失败后再次执行能否从干净基线开始。

  1. 预置一亿条同刻和均匀过期记录,运行清理同时保持在线流量,验证逻辑不可见、批次延迟、复制滞后与磁盘回收。
  2. 让刷新、取消、超时和远端完成在同一调度窗口发生,断言系统只产生一个终态和一次副作用。
  3. 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。

可以上线的标准是:用户知道当前发生了什么,系统在异常后能停止或恢复,资源不会无界增长,运维也能从最小必要证据定位阶段。

把方法变成一次真实连接

打开 uCopy,让两台设备在浏览器里安全连接并开始传输。

开始免费使用