Vapor:亚分钟计划任务

2023 年 12 月 21 日#vapor

要调用 Laravel 的内部 调度程序,你必须每分钟调用一次 schedule:run Artisan 命令。在传统的服务器托管环境中,你可以使用 cron 等实用程序来实现此目的。

image

然而,在无服务器 Vapor 环境中,没有“始终在线”的服务器来运行 cron。相反,我们的 Lambda 函数会根据需要处理工作负载来做出反应。为了解决这个问题,Vapor 使用 AWS EventBridge 调用调度程序,它允许我们编写类似 cron 的表达式,并在该表达式通过时定义要执行的操作 - 在我们的例子中,调用 CLI 函数并调用 schedule:run 命令。

使用 EventBridge 是在无服务器环境中调用调度程序的优雅解决方案。但是,有一个需要注意的地方。AWS 文档指出以下内容

使用 cron 表达式的 EventBridge 规则的最佳分辨率是一分钟。你的计划规则在那一分钟内运行,但不是在精确的第 0 秒。

直到最近,这都不是问题。我们只需要每分钟调用一次调度程序 - 无论过了多少秒都没有关系。

随着 Laravel 10.15 的发布,亚分钟计划被添加到框架中。使用此功能时,必须在每分钟开始时调用调度程序才能按预期工作。

例如,当使用 Laravel 的 everyThirtySeconds 方法计划命令并假设 EventBridge 在 12:00:10 调用调度程序时,该命令实际上将在 12:00:10 和 12:00:40 运行。

当使用 everySecond 时,分钟开始时的秒将完全被错过。

虽然这不是所有人的问题,但我们希望为 Vapor 用户提供启用亚分钟计划预期行为的选项。

从今天开始,你可以通过简单更新应用程序的 vapor.yml 配置文件来启用亚分钟调度支持

id: 2
name: vapor-laravel-app
environments:
    production:
        scheduler: sub-minute
        cli-timeout: 120

设置 scheduler: sub-minute 并部署应用程序后,Vapor 将更新 EventBridge 以调用 vapor:schedule 而不是 schedule:runvapor:schedule 命令会在调用 schedule:run 之前等待下一分钟开始,从而确保 Laravel 的调度程序按预期启动。

你可能已注意到,在上面的 vapor.yml 示例中,cli-timeout 已明确设置为 120。CLI 需要运行至少两分钟,以确保有足够的时间等待下一分钟开始,并允许亚分钟调度程序的每秒执行。如果你的任何命令需要大量时间才能完成,则可能需要将此超时设置为更大的值。你还应确保你的 cli-concurrency 至少为 2,并且你运行的 Vapor Core >= v2.34.0

我们希望你喜欢这个令人兴奋的新更新,它今天已推出。在 Vapor,我们致力于为在无服务器环境中托管你的 Laravel 应用程序构建最佳体验。我们很乐意听到你可能有的任何反馈。

作者 Joe Dixon

Laravel 软件开发人员。

TwitterGitHub我的博客 上找到我。

关注 RSS 源