文件和异步链路上,上线后才暴露的几处漏洞
问题原话:这两周上了文件上传和消息队列,功能测试全过、验收也签了,为什么上线一个月后还是接连出事?
先答:因为功能测试覆盖的是「有人操作、一次成功」的路径,而文件和异步链路的漏洞几乎全在反面——没人操作的地方、时间拉长才现形的地方。中断、重复、积压、静默,四个词能圈住绝大多数事故。逐处列出来,每处给防线:
| 漏洞 | 测试为什么测不到 | 防线 |
|---|---|---|
| 分片上传中断,没传完的碎片留在桶里一直计费 | 测试传的文件都传完了 | 生命周期规则中止未完成分片,超期自动清理 |
| 回调丢失,桶里有、附件表没有 | 测试环境回调从不失败 | 服务端回调之外再加一道对账,定期扫桶比对 |
| 预签名 URL 整条进访问日志,而 URL 本身就是权限 | 功能正常,日志没人翻 | 日志脱敏签名参数,有效期压短 |
| 消息重复消费 | 本地队列为空不重投 | 唯一键加状态 CAS(更新前先确认状态没变),每个消费接口必配 |
| 死信堆着没人看 | 测试没有持续失败的毒消息 | 死信告警加管理页批量处置 |
| 定时任务悄悄漏跑 | 测试当天手动触发都跑过 | 每次跑完记一条「跑到哪天成功」的水位,每天检查「昨天是否 DONE」 |
六处的共同点值得说破:测试环境的对照组太干净——回调不会丢、队列不重投、没人发版重启、没有时间流逝。这些条件在生产全是奢侈品。所以防线的形状也一致:要么对账(两边清单定期比对),要么心跳(最后一次成功的时间可见),要么时限(每个自动动作配一个「多久没人处理就告警」)。三样都没有的环节,就是下一场客诉的位置。
系列:本系列 对象存储:目录、权限、生命周期 | 什么时候真的需要消息队列 | 技术纵深系列索引
相关文章
多租户不是加一个 tenant_id:三种隔离模型与选型
多租户不是加个 tenant_id 就完了。共享表、独立 schema、独立库,三种模型的成本和失效方式不一样。这篇按 Spring Boot + MySQL 讲我怎么选、怎么落地,以及异步、定时任务、MQ、导出这些地方怎么漏。
部门、门店、代理商,一张 sys_dept 表撑不住这三层
需求说“要加门店”,开发在 sys_dept 上加了一列 type,两行代码当天上线。三个月后加代理商,type 多个值;半年后要求门店同时归区域运营、归总部核算,parent_id 只有一个。行政组织、经营单元、外部主体这三层的差别不在层级深浅,在于谁需要历史、谁会算钱、谁是外部人。
权限系统:RBAC 不够用的地方,数据权限怎么补
一句“销售只能看自己的客户”,里面藏着行、列、入口、失效四个判定,RBAC 一个都答不了。这篇讲数据范围怎么落成一条 SQL、@DataScope 这类拼法会在哪一层漏、成本价为什么会整整齐齐出现在导出的 Excel 里,以及为什么详情接口是行级权限最大的口子。