如果需要定时执行 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()
(从 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(我们的多租户分布式无服务器 JavaScript 平台)上,Deno.cron()
会被自动检测和管理,因此您无需担心任何事情。
你可以在没有 Web 服务器的情况下运行 cron 作业,甚至不需要一致的传入请求来保持隔离活动。这是因为每当部署您的项目时,Deno Deploy 都会自动检测您的 cron 作业并对其进行评估。当您的处理程序运行时,Deno Deploy 会自动按需启动隔离来运行它们。
我们还在 Deno Deploy 面板中添加了一个新的 Cron 选项卡,它可以显示项目中所有激活的 cron 作业:
要修改或停止现有的 cron,请更改代码并创建新的部署。例如,如果从代码中移除 Deno.cron 并进行部署,这些作业将不再计划运行。
您的 Deno Cron 处理程序可以执行各种操作,例如更新 Deno KV 中的状态、ping 一个网站、发送一封电子邮件、启动数据库备份、定期调用 API 等等。
即使没有 Web 服务器处理请求,Deno Deploy 到底如何知道代码中存在 cron
?
创建项目的新生产部署时,会使用短暂的 V8 隔离来评估项目的顶层范围并发现任何 Deno.cron
定义。然后,全局 cron 调度程序会根据项目的最新 cron 定义进行更新,其中包括对现有 crons、新 crons 和已删除 crons 的更新。
全局 cron 调度器是一项可靠的服务,负责根据指定的计划调度和分派 cron 作业。在调度过程中,按需 v8 隔离程序会启动,使用相同的生产部署执行作业。
// deno-cron-weather
const 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 作业并将其托管在云中,无需任何配置,只需几分钟即可完成。