您的位置首页 >人工智能 >

直播切片工作台全局调度器与暂存清理实现解析

直播切片工作台里的 ASR、切片、草稿这些业务 Worker 本身自带任务调度循环,专门的周期性磁盘清理工作交给独立的全局调度器来处理,核心就是定时自动清理 staging 暂存目录,防止切片生成过程中临时素材、中间文件持续堆积把磁盘打满,这套调度器代码量很小,不用依赖 Redis、MQ 这类外部中间件,只靠 goroutine+ticker 就可以跑定时任务,清理逻辑是按目录数量配额、文件修改时间排序来删除旧目录,单条目录清理失败不会打断整体清理流程,容错性很好,适合直播切片场景大量临时文件产出、需要自动管控磁盘容量的场景,部署的时候只需要在 main 里注册清理任务,配置好清理间隔和最大保留目录数,启动调度器就可以自动运转。

一、全局调度器基础架构

调度器包路径:internal/scheduler,采用每个任务 Job 单独一个 goroutine 搭配独立 ticker 的设计模型,支持批量注册定时任务。

调度项说明
启动机制Start 方法依靠 sync.Once 保证幂等,重复调用不会重复启动
执行规则调度启动时会立刻执行一次任务,之后再按配置周期循环执行
任务注册所有清理 Job 在 main.go 中完成注册,读取配置文件里的清理周期
隔离设计和业务任务队列完全解耦,只负责周期性运维类工作,不参与切片、ASR 业务任务消费

二、暂存清理两个核心任务

  1. CleanupStaging:清理普通切片任务生成的 staging 暂存目录
  2. CleanupASRStaging:ASR 语音识别对应的独立暂存目录清理

共用同一个配置项 cfg.Web.StagingCleanupInterval() 设置执行周期,分别读取各自的配额参数 StagingMaxDirs、ASRStagingMaxDirs 控制最多保留目录数量。

三、暂存目录清理算法步骤

  1. 读取 staging 一级子目录,过滤掉普通文件、跳过 asr 特殊子目录,不进入子目录递归扫描
  2. 按照文件修改时间 mtime 降序排序,mtime 相同的情况下,按目录路径倒序排序做平局处理
  3. 保留排序靠前 N 个目录(N 就是配置里的最大保留配额),剩下的旧目录执行 os.RemoveAll 删除
  4. 单个目录删除报错时,记录错误信息,继续执行下一条,错误聚合上报,不会中断整个清理流程

四、关键配置清单

web:

staging_cleanup_interval: 30m 暂存清理执行周期

staging_max_dirs: 120 普通staging目录最大保留数量

asr_staging_max_dirs: 80 ASR暂存目录最大保留数量

  • 调优建议:切片并发高的时候,缩短清理间隔、调低最大目录配额;测试环境可以调大配额,方便排查问题。

五、部署与开发步骤

  1. 在 main.go 中导入 scheduler 包,构造 CleanupStaging、CleanupASRStaging 两个清理函数
  2. 调用 scheduler.RegisterJob,绑定清理函数、读取配置的周期参数
  3. 调用 scheduler.Start () 拉起全局调度器,sync.Once 保证安全启动
  4. 启动服务,调度器会立刻执行一轮清理,之后定时循环
  5. 观察日志,查看清理条数、删除失败记录,根据磁盘水位调整配额和周期

六、避坑要点

  1. 全局调度器只管周期性运维任务,不能用来跑切片、ASR 业务任务,业务任务还是交给自带调度循环的 Worker
  2. 清理策略是按目录数量配额控制,不是按文件过期时间,和常见 TTL 清理逻辑不一样,这点要注意区分
  3. 会跳过 asr 特殊目录,ASR 的临时文件由独立的 CleanupASRStaging 单独管理,互不干扰
  4. 单条删除失败只告警不终止,大量磁盘 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 调度与执行)阿里云开发者社区

【免责声明】

本文整理的直播切片工作台全局调度器与暂存清理相关代码逻辑、清理策略、配置参数均对应文章公开内容,具体实现细节、配置默认值可随版本迭代调整;本文仅做原理学习梳理,不直接构成生产上线方案;上线前请自行做压力、磁盘异常场景测试,因配置参数设置不当、磁盘权限问题引发磁盘占满、文件误删等问题,本文不承担相关责任。

今日大家都在搜的词: