本頁面內容
排程 cron 工作
Deno.cron
介面讓您可以使用 cron 語法,設定在可設定的排程上執行的 JavaScript 或 TypeScript 程式碼。在以下範例中,我們設定一個 JavaScript 程式碼區塊,使其每分鐘執行一次。
Deno.cron("Log a message", "* * * * *", () => {
console.log("This will print once a minute.");
});
也可以使用 JavaScript 物件來定義 cron 排程。在以下範例中,我們設定一個 JavaScript 程式碼區塊,使其每小時執行一次。
Deno.cron("Log a message", { hour: { every: 1 } }, () => {
console.log("This will print once an hour.");
});
Deno.cron
接受三個引數
- cron 工作的人工可讀名稱
- cron 排程字串或 JavaScript 物件,定義 cron 工作將在其上執行的排程
- 在給定排程上執行的函式
如果您不熟悉 cron 語法,有許多第三方模組 例如這個,可以協助您產生 cron 排程字串。
重試失敗的執行 跳到標題
失敗的 cron 呼叫會使用預設重試策略自動重試。如果您想要指定自訂重試策略,可以使用 backoffSchedule
屬性來指定等待時間(以毫秒為單位)陣列,以便在再次重試函式呼叫之前等待。在以下範例中,我們將嘗試重試失敗的回呼三次 - 在一秒、五秒和十秒後。
Deno.cron("Retry example", "* * * * *", () => {
throw new Error("Deno.cron will retry this three times, to no avail!");
}, {
backoffSchedule: [1000, 5000, 10000],
});
設計與限制 跳到標題
以下是使用 Deno.cron
時需要注意的一些設計細節和限制。
任務必須在最上層模組作用域中定義 跳到標題
Deno.cron
介面旨在支援根據預定義排程靜態定義 cron 任務。所有 Deno.cron
任務都必須在模組的最上層定義。任何巢狀 Deno.cron
定義(例如在 Deno.serve
處理器內部)都會導致錯誤或被忽略。
如果您需要在 Deno 程式執行期間動態排程任務,可以使用 Deno Queues API。
時區 跳到標題
Deno.cron
排程使用 UTC 時區指定。這有助於避免觀察日光節約時間的時區問題。
重疊執行 跳到標題
您的 cron 任務的下一個排程呼叫有可能與先前的呼叫重疊。如果發生這種情況,Deno.cron
將跳過下一個排程呼叫,以避免重疊執行。
星期幾數字表示法 跳到標題
Deno.cron
不使用從 0 開始的星期幾數字表示法。相反地,它使用 1-7(或 SUN-SAT)來表示星期日到星期六。這可能與使用 0-6 表示法的其他 cron 引擎不同。
在 Deno Deploy 上的使用方式 跳到標題
使用 Deno Deploy,您可以在雲端中的 V8 隔離區中執行背景任務。這樣做時,有幾個注意事項需要牢記在心。
與 Deno CLI 的差異 跳到標題
與其他 Deno runtime 內建功能(如佇列和 Deno KV)一樣,Deno.cron
實作在 Deno Deploy 上的運作方式略有不同。
cron 預設的運作方式 跳到標題
Deno runtime 中 Deno.cron
的實作將執行狀態保留在記憶體中。如果您執行多個使用 Deno.cron
的 Deno 程式,則每個程式都會有自己獨立的 cron 任務集。
cron 在 Deno Deploy 上的運作方式 跳到標題
Deno Deploy 提供 Deno.cron
的伺服器端實作,專為高可用性和規模而設計。Deno Deploy 會在部署時自動提取您的 Deno.cron
定義,並使用隨需隔離區排程它們執行。您最新的生產部署定義了排程執行的作用中 cron 任務集。若要新增、移除或修改 cron 任務,只需修改您的程式碼並建立新的生產部署。
Deno Deploy 保證您的 cron 任務在每個排程時間間隔至少執行一次。這通常表示您的 cron 處理常式在每個排程時間會被呼叫一次。在某些失敗情況下,處理常式可能會針對相同的排程時間被多次呼叫。
Cron 儀表板 跳到標題
當您進行包含 cron 任務的生產部署時,您可以在 Deploy 儀表板中專案的 Cron
標籤下檢視所有 cron 任務的清單。
定價 跳到標題
Deno.cron
呼叫的收費費率與部署的入站 HTTP 請求相同。在此處瞭解更多關於定價的資訊 here。
部署特定限制 跳到標題
Deno.cron
僅適用於生產部署(不適用於預覽部署)- 您的
Deno.cron
處理常式的確切呼叫時間可能會與排程時間相差最多一分鐘
Cron 設定範例 跳到標題
以下是一些常見的 cron 設定,為您方便起見提供。
Deno.cron("Run once a minute", "* * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every fifteen minutes", "*/15 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run once an hour, on the hour", "0 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every three hours", "0 */3 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every day at 1am", "0 1 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every Wednesday at midnight", "0 0 * * WED", () => {
console.log("Hello, cron!");
});
Deno.cron("Run on the first of the month at midnight", "0 0 1 * *", () => {
console.log("Hello, cron!");
});