Orbit
Orbit 定时任务
Cron jobs schedule recurring HTTP requests to your deployed project, so a nightly cleanup, an hourly sync or a weekly digest runs on time without you standing up a separate scheduler.
Cron 任务通过定期调用您已部署项目的 HTTP 请求来运行计划任务,这样每晚的清理、每小时的同步或每周的摘要都能按时运行,无需您单独部署一个调度器。
Cron 任务的位置
打开 Orbit,单击该项目,然后在项目标签栏的 Configure 组下选择 Crons。该页面标题为 Cron jobs,说明了其用途:使用标准五字段 cron 语法(UTC 时区)或别名 @hourly、@daily、@weekly 和 @monthly 来安排对您的生产部署的 HTTP 请求。
该页面显示 Target host,您可以一目了然地确认它指向正确的部署。

工作原理
Orbit 不在调度器中运行您的代码。它按计划调用您自己项目上的 URL,您的代码来完成工作。
这意味着您安排的是应用程序中的普通路由,例如 /api/cron/cleanup。您的应用在响应请求时能做的任何事,都可以按计划执行。
创建 Cron 任务
- 单击 New cron。
- 为其指定 Name,最多 120 个字符。
- 设置项目上的 Path,以斜杠开头。
- 从预设中选择 Schedule 或输入一个表达式。
- 选择 Method。
GET是默认值。 - 如果方法是 POST、PUT 或 PATCH,请添加 Request body。
- 设置 Timeout,范围 1 到 300 秒。默认值为 30。
- 除非您有自己的身份验证,否则保持 Generate a Bearer secret 选项处于勾选状态。
- 单击 Create cron。
计划预设
| 预设 | 表达式 |
|---|---|
| 每 5 分钟 | */5 * * * * |
| 每 15 分钟 | */15 * * * * |
| 每小时 | @hourly |
| 每天 09:00 UTC | 0 9 * * * |
| 每天午夜 | @daily |
| 周一 09:00 | 0 9 * * 1 |
| 每月 1 日 | @monthly |
或者编写您自己的五字段表达式:分钟、小时、日期、月份、星期几。
所有计划均为 UTC,无夏令时调整。设置为 0 9 * * * 的任务全年 9am UTC 运行,这与新西兰时间的偏差每年会漂移一小时两次。如果任务必须在特定本地时间运行,请有意选择 UTC 小时,并记录您针对年中哪个时段进行了优化。
对调用进行身份验证
保持 Bearer 密钥选项处于勾选状态会生成一个随机令牌,该令牌会在每次执行时作为 Authorization 标头发送。创建后会立即显示一次,并注明不会再次显示。
复制它并在您的处理程序中检查它:
export async function GET(req) {
const auth = req.headers.get('authorization');
if (auth !== `Bearer ${process.env.CRON_SECRET}`) {
return new Response('Unauthorized', { status: 401 });
}
// do the work
}
使用项目的环境变量存储密钥:参见 Orbit 中的环境变量。
如果没有这样的检查,您的 cron 路径就是一个公开 URL,任何人都可以随意调用它。对于无害的东西来说这没问题,但对于任何写入、发送电子邮件或花费金钱的东西来说就很严重了。在第一次运行之前添加检查,而不是在有人发现端点之后。
您也可以改为发送自己的标头,如果您的应用已有身份验证方案。
读取任务列表
每个任务显示:
- Schedule,它运行的表达式。
- Next,它何时会再次运行。
- Last,它上次运行的时间及其结果。
- ok / fail 计数器。
- Last error,最近失败留下的消息。
- 关闭时的 PAUSED 徽章。
每行有四个操作:Run now、Pause 或 Resume 和 Delete。
Run now 立即执行任务,不管其计划如何,并报告结果。这是测试新任务的正确方法,而不是等待下一个周期。
执行结果
| 状态 | 含义 |
|---|---|
| OK | 您的端点返回了成功响应 |
| FAILED | 您的端点返回错误,或无法发出请求 |
| TIMEOUT | 您的端点未在超时时间内响应 |
| SKIPPED | 执行未运行 |
每次执行都会记录其状态、响应代码、持续时间、错误和触发因素,所以间歇性失败的任务会留下一条线索供您读取,而不是单个"最后错误"。
选择超时
超时是每次执行的,范围 1 到 300 秒,默认值为 30。
将其设置在任务真实最坏情况的略高处,而不是远高于。对已挂起的任务设置宽松超时意味着构建器等待无所事事长达五分钟。对合法需要两分钟的任务设置紧凑超时意味着永久失败和误导的警报。
更好的做法是,保持处理程序快速:让它入列工作并立即返回,而不是内联进行工作。在 200 毫秒内返回的 cron 任务永不会超时。
限制
一个项目最多可以保存 50 个 cron 任务。这是每个项目的,所以有多个项目的账户总计会更多。
如果您需要对暂存而不是生产进行计划安排,请改用 Settings 中的 Cron triggers。该卡片允许您选择环境,每个项目最多 10 个触发器。参见 Orbit 项目设置。
删除任务
单击 Delete 并确认。确认会注明执行历史也将被移除,所以如果您想保留任务行为的记录,请在删除前捕获它。
暂停而不是删除以临时停止任务。暂停会保持配置、密钥和历史记录完整。
实际建议
使处理程序具有幂等性。 Cron 调用可以重试,Run now 可以在已有计划运行进行时按下。您的处理程序应该能够处理运行两次而不做两次工作。
不要将所有内容安排在整点。 0 * * * * 在每个任务上意味着每个任务在同一时刻竞争。分散它们:7 * * * *、23 * * * * 等等。
在处理程序中记录。 执行记录会告诉您响应代码和持续时间。实际发生的是您应用的业务,当任务默默地什么都不做时您会需要它。
故障排除
每次执行都是 FAILED,返回 401。 您的处理程序拒绝了请求。检查存储在您的环境变量中的密钥是否与此处生成的密钥匹配,包括比较中的 Bearer 前缀。
每次执行都是 FAILED,返回 404。 该路径在已部署的项目上不存在。针对页面上显示的目标主机在浏览器中测试它。
执行超时。 处理程序正在内联进行太多工作。分割工作,或如果工作确实花费那么长时间且不是失控,则提高超时。
Next 永不推进。 任务已暂停。查找 PAUSED 徽章。
任务在错误的时间运行。 检查 UTC 与您的本地时间。这是定时任务最常见的意外。
下一步
- Orbit 中的环境变量,用于存储 cron 密钥。
- Orbit 项目设置,用于每个环境的 cron 触发器。
- Orbit Webhooks,在出现问题时获得通知。