foxxmd/laravel-elasticbeanstalk-cron

确保在 EB 环境中只有一个 Laravel 实例运行 CRON 作业

1.3 2022-06-17 05:30 UTC

This package is auto-updated.

Last update: 2024-09-17 10:12:09 UTC


README

确保在 Elastic Beanstalk 环境中只有一个实例运行 Laravel 的调度器

许多人遇到的常见问题(见此文章此文章)是 Amazon 的 Elastic Beanstalk 在环境中维护单个实例运行 Laravel 的任务调度器。由于自动扩展不保证任何实例无限期运行,并且环境中没有“主从”关系来区分实例,因此会出现困难。

尽管 Amazon 提供了一个 解决方案,但这涉及到设置一个工作层,然后可能还需要创建新的路由和方法来实现需要运行的任务。太糟糕了!

此包提供了一种简单、零配置的解决方案,用于在 Elastic Beanstalk 环境中维护一个运行任务调度器的实例。

Amazon Linux 1 废弃

Amazon Linux 1 (AL1) 将很快停止支持,建议迁移到使用 Amazon Linux 2 (AL2) (请参阅此处) 从此版本开始将仅支持 AL2,请使用之前版本用于 AL1。

它是如何工作的?

很高兴你问了!以下过程完全自动化,只需将 .platform 文件夹发布到应用程序的根目录。

1. 使用 Elastic Beanstalk 的高级配置运行 CRON 设置命令

自 AL2 以来,EB 应用程序可以包含 平台钩子,这为 EB 环境提供高级配置,称为 .platform

此包提供了一个配置文件,在部署时(每个实例初始化时)运行两个命令,设置运行任务调度器所需的条件。

2. 运行 system:start:leaderselection

这是部署时运行的第一个命令。它配置实例的 Cron,以在配置的时间间隔(默认 = 5 分钟)运行 Leader Selection

3. 运行 Leader Selection aws:configure:leader

这是 Leader Selection 命令。它执行以下操作:

  • 获取正在运行的实例的 Id
  • 获取此实例的 EnvironmentName。 (当在 EB 环境中运行时,所有 EC2 实例都具有相同的 EnvironmentName
  • 获取所有具有该 EnvironmentName 的正在运行的 EC2 实例
  • 找到 最早启动的实例

如果此实例是第一个启动的,则被认为是 Leader 并运行 system:start:cron

4. 运行 system:start:cron

此命令仅在当前运行的 Leader Selection 实例是 Leader 时运行。它在实例的 Cron 中插入另一个条目以运行 Laravel 的调度器

这就完成了!

现在只有一个实例,即最早启动的实例,其Cron中会插入调度器。如果该实例被自动扩展终止,将在5分钟内(或配置的间隔)从剩余运行的实例中选择一个新的Leader。

安装

对于Amazon Linux 2,需要此包

composer require "foxxmd/laravel-elasticbeanstalk-cron"

或者对于Amazon Linux 1

composer require "foxxmd/laravel-elasticbeanstalk-cron@^0.9"

添加包后,将ServiceProvider添加到config/app.php中的providers数组中(对于Laravel 5.4或更低版本)

\FoxxMD\LaravelElasticBeanstalkCron\ElasticBeanstalkCronProvider::class

然后,发布.platform文件夹和配置文件

php artisan vendor:publish --tag=ebcron

别忘了为EB Platform Hooks脚本添加+x权限

find .platform -type f -iname "*.sh" -exec chmod +x {} +

配置

为了使Leader选择运行,必须存在几个环境变量

  • USE_CRON = true -- 必须设置才能发生Leader选择。(这可以用来防止在不需要的环境中发生选择,例如Workers等。)
  • AWS_ACCESS_KEY_ID -- 需要用于只读访问EC2客户端
  • AWS_SECRET_ACCESS_KEY -- 需要用于只读访问EC2客户端
  • AWS_REGION -- 设置使用EC2客户端时使用的AWS区域,如果未设置,默认为us-east-1

这些可以包含在您的.env文件中,或者对于EB,在环境的配置部分。

贡献

为一些额外功能创建一个PR,我将欣然接受它 :)

许可

此软件包采用MIT许可