如果需要定時執行 JS 腳本,以后多一個選項。
Web 構建日益復雜。編寫現代軟件包括利用云基礎設施、剖析模板代碼和管理復雜的配置,而開發人員只想專注于編寫業務邏輯。
Deno 旨在通過刪除配置和不必要的模板,從根本上簡化 Web 開發。我們將無服務器數據庫 Deno KV 和 Deno Queues(一種卸載任務或安排未來工作的方法)直接內置到運行時中,因此將它們添加到應用程序中只需幾行代碼即可。
今天,我們很高興通過引入 Deno Cron 來簡化 Web 開發,這是一種創建預定作業的簡單方法:
Deno.cron("Sample cron job", "*/10 * * * *", () => {console.log("This will run every 10 minutes");
});
使用 Deno Cron
Deno.cron()
(從 1.38 開始可在 `–unstable`` 標志后面使用)是一個帶有三個參數的函數:
name
,計劃任務的名稱schedule
,它使用 Unix cron 格式并且時間采用 UTC 時區handler
,按提供的時間表執行的函數
與 UNIX/Linux 上的 cron 不同,Deno Cron 執行不會重疊。這意味著,如果您安排某項任務每 10 分鐘運行一次,但該任務需要 30 分鐘才能完成,Deno Cron 會自動跳過下一次計劃運行,直到該任務完成。重疊的 cron 作業可能會導致意想不到的問題,并且需要額外繁瑣的邏輯來避免,但 Deno Cron 完全回避了這一點。
我們還致力于支持 JavaScript 友好的 API,用于指定 cron 計劃。
Deno Deploy 上的 Deno Cron
在 Deno Deploy(我們的多租戶分布式無服務器 JavaScript 平臺)上,Deno.cron()
會被自動檢測和管理,因此您無需擔心任何事情。
你可以在沒有 Web 服務器的情況下運行 cron 作業,甚至不需要一致的傳入請求來保持隔離活動。這是因為每當部署您的項目時,Deno Deploy 都會自動檢測您的 cron 作業并對其進行評估。當您的處理程序運行時,Deno Deploy 會自動按需啟動隔離來運行它們。
我們還在 Deno Deploy 面板中添加了一個新的 Cron 選項卡,它可以顯示項目中所有激活的 cron 作業:
要修改或停止現有的 cron,請更改代碼并創建新的部署。例如,如果從代碼中移除 Deno.cron 并進行部署,這些作業將不再計劃運行。
您的 Deno Cron 處理程序可以執行各種操作,例如更新 Deno KV 中的狀態、ping 一個網站、發送一封電子郵件、啟動數據庫備份、定期調用 API 等等。
它在 Deno Deploy 上如何工作?
即使沒有 Web 服務器處理請求,Deno Deploy 到底如何知道代碼中存在 cron
?
創建項目的新生產部署時,會使用短暫的 V8 隔離來評估項目的頂層范圍并發現任何 Deno.cron
定義。然后,全局 cron 調度程序會根據項目的最新 cron 定義進行更新,其中包括對現有 crons、新 crons 和已刪除 crons 的更新。
全局 cron 調度器是一項可靠的服務,負責根據指定的計劃調度和分派 cron 作業。在調度過程中,按需 v8 隔離程序會啟動,使用相同的生產部署執行作業。
// deno-cron-weatherconst db = await Deno.openKv();// Hourly cron job to write weather data time series to Deno KV
Deno.cron("Write weather data to Deno KV", "0 * * * *", async () => {console.log("Pull weather data and set to Deno KV");const res = await fetch('https://api.open-meteo.com/v1/forecast?latitude=34.0522&longitude=-118.2437&hourly=temperature_2m,precipitation&timezone=America%2FLos_Angeles');const body = await res.json();const date = new Date(Date.now()).toString();await db.set(["weather", date], {temperature: body.hourly.temperature_2m[0],precipitation: body.hourly.precipitation[0]});
});// HTTP server to get the weather data time series
Deno.serve(async (_req) => {const entries = db.list({ prefix: ["weather"] });let responseString = "";for await (const entry of entries) {responseString += `${entry.key[1]}: ${entry.value.temperature}°C with ${entry.value.precipitation}mm precipitation\n`;}return new Response(responseString);
})
在 Deno Deploy 上使用 Deno Cron 可以輕松創建 cron 作業并將其托管在云中,無需任何配置,只需幾分鐘即可完成。