定時調度
CRON / INTERVAL / ONE_TIME / DELAYED_COMPLETION 四種排程類型的設定、時區處理與 workflow 鏈式觸發。
Braidrun 的排程器支援四種觸發類型:CRON(週期運算式)、INTERVAL(固定間隔)、ONE_TIME(一次性)、DELAYED_COMPLETION(工作流鏈式觸發)。所有 schedule 由平台排程服務統一管理,服務重啟後按各自時間表繼續觸發。
概念:schedule 與 execution
一個 schedule 描述「何時觸發」;每次觸發會建立一次 execution。Schedule 自身是長期物件,execution 是一次性的執行記錄。Schedule 可以攜帶一份靜態的 inputs(鍵值對),每次觸發都作為 execution 的輸入變數。
每條 schedule 獨立儲存自己的時區(IANA 名稱,如 Asia/Shanghai),伺服器端按它計算觸發時間。Web UI 新建時預設使用目前帳號時區;走 API 建立時建議總是顯式傳 timezone。
四種排程類型
| 類型 | 關鍵欄位 | 行為 |
|---|---|---|
CRON | cronExpression, timezone | 按 5 段 cron 運算式週期觸發,粒度到分鐘 |
INTERVAL | interval, startTime, endTime | 每隔固定毫秒數觸發一次,可限定起止時間 |
ONE_TIME | startTime | 到點觸發一次,隨後自動停用 |
DELAYED_COMPLETION | triggerWorkflowId, delaySeconds | 上游工作流成功完成後延遲 N 秒觸發,用於工作流鏈 |
四種類型共用一套通用欄位:enabled(是否啟用)、maxRuns(最大觸發次數)、inputs(靜態輸入變數)。endTime 已過或觸發次數達到 maxRuns 時,schedule 會被自動停用,但不會被刪除。
建立 CRON schedule
curl -X POST https://braidrun.com/api/schedules \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"workflowId": "<workflow-id>",
"name": "Daily 9 AM report",
"scheduleType": "CRON",
"cronExpression": "0 9 * * *",
"timezone": "Asia/Shanghai",
"inputs": {
"environment": "production"
}
}'cron 運算式為 5 段制:分 時 日 月 週。支援 *、列表(1,3,5)、區間(1-5)、步進(*/6);週日可寫 0 或 7。觸發時間按 schedule 自己的 timezone 計算。
| 表達式 | 含義 |
|---|---|
0 9 * * * | 每天 09:00 |
0 9 * * 1-5 | 工作日 09:00 |
0 */6 * * * | 每 6 小時 |
30 14 1 * * | 每月 1 日 14:30 |
平台多執行個體部署時,同一個觸發點由分散式鎖去重:只有一個節點真正發起執行,不會因為節點數增加而重複觸發。
INTERVAL:固定間隔
請求主體和 CRON 一樣發到 POST /api/schedules,只是欄位不同:
{
"workflowId": "<workflow-id>",
"name": "每 5 分钟同步一次",
"scheduleType": "INTERVAL",
"interval": 300000,
"startTime": 1785542400000,
"endTime": 1788220800000,
"maxRuns": 500
}interval— 觸發間隔,單位毫秒;小於 1 秒的值會被抬到 1 秒startTime/endTime— 可選,epoch 毫秒時間戳記;設了 startTime 會先等到該時刻再開始,過了 endTime 自動停用maxRuns— 可選,觸發滿這麼多次後自動停用
ONE_TIME:一次性
{
"workflowId": "<workflow-id>",
"name": "上线前补跑一次",
"scheduleType": "ONE_TIME",
"startTime": 1785546000000
}startTime 為 epoch 毫秒時間戳記。到點觸發一次後 schedule 自動停用;多執行個體部署下由一次性鎖保證只觸發一次。
工作流鏈式排程(DELAYED_COMPLETION)
DELAYED_COMPLETION 把兩個工作流串成鏈:上游工作流 A 每次以 COMPLETED 狀態結束後,等 delaySeconds 秒,自動觸發本 schedule 綁定的工作流 B。典型用法:資料拉取工作流跑完 10 分鐘後自動跑報表工作流。
{
"workflowId": "<workflow-B-id>",
"name": "A 完成 10 分钟后跑 B",
"scheduleType": "DELAYED_COMPLETION",
"triggerWorkflowId": "<workflow-A-id>",
"delaySeconds": 600,
"maxRuns": 10
}- 無論 A 是被手動、Webhook、定時還是鏈式觸發的,只要成功完成就會計入;失敗或被取消的執行不會觸發下游
delaySeconds— 必填,0 到 30 天(2592000 秒);0 表示完成後立即觸發maxRuns— 不填為不限次數;填 1 表示只鏈一次;填 N 表示最多鏈 N 次,達到後自動停用triggerWorkflowId— 不能等於 workflowId(自己觸發自己會無限迴圈),且建立者需要對上游工作流有查看權限- 等待中的延遲觸發會持久化儲存,服務重啟或滾動發布不會遺失:到點後照常觸發
管理 schedule
| 端點 | 作用 |
|---|---|
GET /api/schedules | 列出可見的全部 schedule |
GET /api/schedules/{id} | 查看單條 |
PUT /api/schedules/{id} | 更新;欄位與建立相同,改類型時按新類型重新校驗 |
DELETE /api/schedules/{id} | 刪除 |
POST /api/schedules/{id}/toggle | 啟用 / 停用 |
POST /api/schedules/{id}/run | 繞過時間表立即執行一次 |
GET /api/schedules/{id}/history | 觸發歷史 |
GET /api/schedules/workflows/{workflowId} | 列出某工作流下的全部 schedule |
# 立即执行一次(返回这次 execution)
curl -X POST https://braidrun.com/api/schedules/<schedule-id>/run \
-H "Authorization: Bearer <token>"
# 停用(enabled=true 则启用;不带参数则在两者间切换)
curl -X POST "https://braidrun.com/api/schedules/<schedule-id>/toggle?enabled=false" \
-H "Authorization: Bearer <token>"
# 最近 50 条触发历史
curl "https://braidrun.com/api/schedules/<schedule-id>/history?limit=50" \
-H "Authorization: Bearer <token>"toggle 的 enabled 可以放 query 參數或 JSON body;兩者都不傳時在啟用 / 停用之間切換。history 每條記錄含狀態、成功與否、起止時間,limit 預設 50、最大 500。
共享輸入與參數預設
除了在 schedule 上直接設定 inputs,還可以給工作流建「參數預設」:同一個 workflow 用不同預設跑不同設定。
# 创建一个参数预设
curl -X POST https://braidrun.com/api/workflows/<wf>/presets \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "生产环境",
"description": "生产环境参数",
"variables": {
"environment": "production",
"debug_mode": "false",
"max_retries": "3"
}
}'
# 用预设触发执行
curl -X POST https://braidrun.com/api/workflows/<wf>/presets/<id>/execute \
-H "Authorization: Bearer <token>"多工作流批量併發
從工作流列表多選後點擊"併發執行",會一次啟動一批 execution。
- 每個被選中的 workflow 都會創建自己的 execution 記錄
- 超出 maxConcurrency 的 execution 會先進入 PENDING
- 前面運行中的 execution 完成後,隊列中的下一個自動轉成 RUNNING
0表示不限制,同時啟動整批
Workflow 頂層的 concurrency 控制的是單個 workflow 內部 DAG 同層併發;兩者互不干擾。
服務重啟後的行為
- 已觸發的 execution:默認標 INTERRUPTED,除非開啟了自動續跑(見重啟與自動續跑)
- 未到時間的 CRON / INTERVAL / ONE_TIME:重啟後照常觸發
- 等待中的 DELAYED_COMPLETION 延遲觸發:已持久化,重啟後繼續等到點觸發
- 宕機期間錯過的觸發點:不補跑(避免雙寫風險)