要调用 Laravel 的内部 调度程序,你必须每分钟调用一次 schedule:run
Artisan 命令。在传统的服务器托管环境中,你可以使用 cron 等实用程序来实现此目的。
然而,在无服务器 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:run
。vapor:schedule
命令会在调用 schedule:run
之前等待下一分钟开始,从而确保 Laravel 的调度程序按预期启动。
你可能已注意到,在上面的 vapor.yml
示例中,cli-timeout
已明确设置为 120
。CLI 需要运行至少两分钟,以确保有足够的时间等待下一分钟开始,并允许亚分钟调度程序的每秒执行。如果你的任何命令需要大量时间才能完成,则可能需要将此超时设置为更大的值。你还应确保你的 cli-concurrency
至少为 2
,并且你运行的 Vapor Core >= v2.34.0
。
我们希望你喜欢这个令人兴奋的新更新,它今天已推出。在 Vapor,我们致力于为在无服务器环境中托管你的 Laravel 应用程序构建最佳体验。我们很乐意听到你可能有的任何反馈。