deno.com
本頁面內容

排程 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 任務的清單。

a listing of cron tasks in the Deno dashboard

定價 跳到標題

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!");
});
每天凌晨 1 點執行
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!");
});
每月 1 號午夜執行
Deno.cron("Run on the first of the month at midnight", "0 0 1 * *", () => {
  console.log("Hello, cron!");
});

您找到需要的資訊了嗎?

隱私權政策