Cron 任务修复说明¶
问题描述¶
用户报告 Cloudflare Worker 的 cron 任务在 10 月 5 日后停止自动运行,尽管配置为每天运行(0 0 * * *
)。
根本原因¶
原有的 scheduled
函数实现存在以下问题:
- 同步执行所有项目:尝试在单次 cron 触发中循环处理所有项目
- 超时风险:Cloudflare Workers 有严格的执行时间限制(30 秒)
- CPU 时间限制:免费版 10ms,付费版 50ms CPU 时间
- 大量项目处理:如果有 100+ 个项目,即使每个项目只需几秒,总时间也会超过限制
原代码问题¶
async scheduled(_, env) {
await writeSyncCursor(env, STATE_KEY_FULL_SYNC, 0);
let cursor = 0;
while (cursor < totalProjects) {
// 循环处理所有项目 - 会超时!
const result = await executeSync(env, {}, cursor, MAX_PROJECTS_PER_RUN, false);
cursor = result.nextCursor;
await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟加剧问题
}
}
解决方案¶
修改为增量处理模式:
新实现特点¶
- 每次只处理一批:每次 cron 触发只处理 10 个项目
- 使用状态游标:通过数据库存储的 cursor 跟踪进度
- 自动循环:完成所有项目后自动重置 cursor 到 0
- 可靠性高:即使某次失败,下次会从上次位置继续
新代码逻辑¶
async scheduled(_, env) {
const cursor = await readSyncCursor(env, STATE_KEY_FULL_SYNC);
const manifest = await fetchManifest(env);
// 检查是否完成完整周期
if (cursor >= totalProjects) {
await writeSyncCursor(env, STATE_KEY_FULL_SYNC, 0);
return;
}
// 只处理一批(10 个项目),使用状态管理
const result = await executeSync(env, {}, cursor, MAX_PROJECTS_PER_RUN, true);
}
工作流程¶
优化后的配置(500+ 项目)¶
假设有 500 个项目:
每 2 小时运行一次,每次处理 50 个项目
- 00:00:处理项目 0-49,cursor → 50
- 02:00:处理项目 50-99,cursor → 100
- 04:00:处理项目 100-149,cursor → 150
- 06:00:处理项目 150-199,cursor → 200
- 08:00:处理项目 200-249,cursor → 250
- 10:00:处理项目 250-299,cursor → 300
- 12:00:处理项目 300-349,cursor → 350
- 14:00:处理项目 350-399,cursor → 400
- 16:00:处理项目 400-449,cursor → 450
- 18:00:处理项目 450-499,cursor → 500
- 20:00:检测到 cursor ≥ 500,重置 cursor → 0
- 22:00:重新开始,处理项目 0-49
结果:500 个项目在 20 小时内完成一轮完整同步 ✅
优势¶
- 每天完整同步:500 个项目在 20 小时内完成,确保每天至少同步一次
- 不会超时:每次处理 50 个项目,执行时间约 20-25 秒,在 30 秒限制内
- 进度持久化:即使某次失败,下次从断点继续
- 资源友好:分 12 次运行,均匀分布负载
- 易于监控:每次运行都有清晰的日志输出
- API 限制友好:每 2 小时运行,不会触发 GitHub API rate limit
验证步骤¶
- 部署更新:
cd tools/ai-oss-rank-worker
wrangler deploy
- 检查 Cloudflare Dashboard:
- 进入 Workers & Pages
- 选择
ai-oss-rank-worker
- 查看 Triggers 标签页
-
确认 cron 已启用
-
查看执行日志:
wrangler tail
- 手动触发测试:
curl "https://ai-oss-rank-worker.jimmysong.io/recalculate?limit=10"
- 查看 cursor 状态:
wrangler d1 execute ai-oss-rank --command "SELECT * FROM sync_state WHERE key = 'full-sync'"
排查建议¶
如果 cron 仍未运行,检查以下项:
- Cron 是否启用:在 Cloudflare Dashboard 中确认
- Worker 是否部署:检查最新部署时间
- 查看错误日志:
wrangler tail
查看实时日志 - 检查速率限制:GitHub API 是否达到限制
- 验证环境变量:确认
GITHUB_TOKEN
已设置
相关文件¶
/tools/ai-oss-rank-worker/src/worker.ts
:主要修改文件/tools/ai-oss-rank-worker/README.md
:更新的文档/tools/ai-oss-rank-worker/wrangler.toml
:cron 配置
日期¶
- 修复日期:2025-10-07
- 修复作者:GitHub Copilot
- 问题报告:用户发现 10/5 后 cron 未运行