直播切片工作台里的 ASR、切片、草稿这些业务 Worker 本身自带任务调度循环,专门的周期性磁盘清理工作交给独立的全局调度器来处理,核心就是定时自动清理 staging 暂存目录,防止切片生成过程中临时素材、中间文件持续堆积把磁盘打满,这套调度器代码量很小,不用依赖 Redis、MQ 这类外部中间件,只靠 goroutine+ticker 就可以跑定时任务,清理逻辑是按目录数量配额、文件修改时间排序来删除旧目录,单条目录清理失败不会打断整体清理流程,容错性很好,适合直播切片场景大量临时文件产出、需要自动管控磁盘容量的场景,部署的时候只需要在 main 里注册清理任务,配置好清理间隔和最大保留目录数,启动调度器就可以自动运转。
一、全局调度器基础架构
调度器包路径:internal/scheduler,采用每个任务 Job 单独一个 goroutine 搭配独立 ticker 的设计模型,支持批量注册定时任务。
| 调度项 | 说明 |
|---|---|
| 启动机制 | Start 方法依靠 sync.Once 保证幂等,重复调用不会重复启动 |
| 执行规则 | 调度启动时会立刻执行一次任务,之后再按配置周期循环执行 |
| 任务注册 | 所有清理 Job 在 main.go 中完成注册,读取配置文件里的清理周期 |
| 隔离设计 | 和业务任务队列完全解耦,只负责周期性运维类工作,不参与切片、ASR 业务任务消费 |
二、暂存清理两个核心任务
- CleanupStaging:清理普通切片任务生成的 staging 暂存目录
- CleanupASRStaging:ASR 语音识别对应的独立暂存目录清理
共用同一个配置项 cfg.Web.StagingCleanupInterval() 设置执行周期,分别读取各自的配额参数 StagingMaxDirs、ASRStagingMaxDirs 控制最多保留目录数量。
三、暂存目录清理算法步骤
- 读取 staging 一级子目录,过滤掉普通文件、跳过 asr 特殊子目录,不进入子目录递归扫描
- 按照文件修改时间 mtime 降序排序,mtime 相同的情况下,按目录路径倒序排序做平局处理
- 保留排序靠前 N 个目录(N 就是配置里的最大保留配额),剩下的旧目录执行 os.RemoveAll 删除
- 单个目录删除报错时,记录错误信息,继续执行下一条,错误聚合上报,不会中断整个清理流程
四、关键配置清单
web:
staging_cleanup_interval: 30m 暂存清理执行周期
staging_max_dirs: 120 普通staging目录最大保留数量
asr_staging_max_dirs: 80 ASR暂存目录最大保留数量
- 调优建议:切片并发高的时候,缩短清理间隔、调低最大目录配额;测试环境可以调大配额,方便排查问题。
五、部署与开发步骤
- 在 main.go 中导入 scheduler 包,构造 CleanupStaging、CleanupASRStaging 两个清理函数
- 调用 scheduler.RegisterJob,绑定清理函数、读取配置的周期参数
- 调用 scheduler.Start () 拉起全局调度器,sync.Once 保证安全启动
- 启动服务,调度器会立刻执行一轮清理,之后定时循环
- 观察日志,查看清理条数、删除失败记录,根据磁盘水位调整配额和周期
六、避坑要点
- 全局调度器只管周期性运维任务,不能用来跑切片、ASR 业务任务,业务任务还是交给自带调度循环的 Worker
- 清理策略是按目录数量配额控制,不是按文件过期时间,和常见 TTL 清理逻辑不一样,这点要注意区分
- 会跳过 asr 特殊目录,ASR 的临时文件由独立的 CleanupASRStaging 单独管理,互不干扰
- 单条删除失败只告警不终止,大量磁盘 IO 报错的时候,要排查磁盘权限、挂载异常
【常见问题】
问题 1:直播切片工作台全局调度器与暂存清理,全局调度器和切片 Worker 调度有什么区别?
回答 1:直播切片工作台全局调度器与暂存清理里,切片 Worker 调度是业务调度,负责消费数据库里的切片、ASR 任务队列;全局调度器是独立轻量定时框架,只用来跑 staging 暂存清理这类周期性运维工作,二者互相解耦,全局调度器不参与业务任务抢占。
问题 2:直播切片工作台全局调度器与暂存清理,暂存清理是按文件过期时间删除吗?
回答 2:直播切片工作台全局调度器与暂存清理的清理逻辑不是按过期时间,是按目录数量配额,读取目录 mtime 排序,保留最新 N 个目录,超出配额的旧目录删除,适合直播切片临时文件持续生成的场景。
问题 3:直播切片工作台全局调度器与暂存清理,暂存清理任务失败会不会导致整个调度器停止?
回答 3:直播切片工作台全局调度器与暂存清理做了容错设计,单个目录删除失败只会收集错误日志,继续处理剩余目录,单任务异常不会停止全局调度器,也不会打断本轮暂存清理流程。
问题 4:直播切片工作台全局调度器与暂存清理,全局调度器是否依赖 Redis 或者消息队列?
回答 4:直播切片工作台全局调度器与暂存清理的调度器只用 goroutine 和 ticker 实现,总共约 90 行核心代码,不需要 Redis、MQ 等外部组件,轻量无依赖,开箱就能集成进直播切片工作台。
【参考资料】
[2026-11-13](
【直播切片工作台】第 35 章:全局调度器与暂存清理)阿里云开发者社区
[2026-11-14](直播切片工作台系列文章目录,调度与暂存清理要点摘要)阿里云开发者社区
[2026-11-10](
【直播切片工作台】第 32 章:AI 切片 Worker 调度与执行)阿里云开发者社区
【免责声明】
本文整理的直播切片工作台全局调度器与暂存清理相关代码逻辑、清理策略、配置参数均对应文章公开内容,具体实现细节、配置默认值可随版本迭代调整;本文仅做原理学习梳理,不直接构成生产上线方案;上线前请自行做压力、磁盘异常场景测试,因配置参数设置不当、磁盘权限问题引发磁盘占满、文件误删等问题,本文不承担相关责任。
