foxxmd / laravel-elasticbeanstalk-cron
确保在 EB 环境中只有一个 Laravel 实例运行 CRON 作业
Requires
- aws/aws-sdk-php: ^3.26
- illuminate/console: 5 - 9
- illuminate/support: 5 - 9
- lstrojny/functional-php: ^1.17
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许可。