SWE / RE / ML · System Design

视频发布存储:分片上传、转码任务与播放Manifest

上传完成、处理完成和可播放是三个状态。

题目重点:上传完成、处理完成和可播放是三个状态。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 支持视频上传、持久存储、转码/缩略图和播放;推荐/直播/版权规则未指定,训练不扩成全平台。
  • 上传可能中断重试,文件与转码输出以不可变版本引用;原始视频保留策略先明确。

解题路线

  1. 上传初始化生成video/upload ID、size与分片计划,client直传对象存储。complete先确认分片/校验manifest再标uploaded,不因为最后一个请求到达就相信文件完整。
  2. 写uploaded状态与转码outbox原子提交,job按输入digest+profile去重。worker产生各码率/分辨率输出到attempt路径,通过校验后条件提交playback manifest。
  3. status uploading→uploaded→processing→ready/failed;ready需最低可播profile存在,其它高清profile可later available。客户端查询状态/重试不会重复发布同一个video ID。
  4. 播放经CDN取短期授权manifest与segments,range/分段支持seek;origin不承担所有播放bytes。内容不可变hash/version便于cache,删除/权限改变仍要拒绝新签名,旧签名窗口明示。
  5. 清理不完整upload和失败attempt应按lease/最后活跃时间,避免删除仍在上传的数据。孤儿对象扫描与数据库状态对照,保留足够恢复窗口。

手动走一遍

upload complete ACK丢失,重试同upload ID返回已确认manifest,不产生第二video。转码失败只重跑失败profile,已通过输出可保留,不能在ready状态返回缺失segments。

规模与取舍

数据量按上传率×时长×源bitrate及输出profile之和预算;转码算力按视频时长/codec。观看带宽≈并发×所选bitrate,元数据QPS不能代表整体容量。

易错点与追问

容易失分的边界

  • 数据库先ready、对象还未上传完成。
  • 重复job输出写同路径造成半成品覆盖。

继续深挖

  • 切codec/profile版本时怎样保持旧manifest可播?
  • 用户删除时对象回收与CDN缓存失效怎样协调?
✓已复制微信号!