eis3nhorn / laravel-elasticbeanstalk-cron
确保在 EB 环境中只有一个 Laravel 实例运行 CRON 作业
Requires
- aws/aws-sdk-php: ^3.26
- illuminate/console: ~5.1
- illuminate/support: ~5.1
- lstrojny/functional-php: ^1.2
This package is auto-updated.
Last update: 2024-09-26 08:02:52 UTC
README
*** 此分支使用 getenv 获取变量(如 USE_CRON),而不是使用 config 读取它们,因为自 2018 年 12 月 4 日起,它在 Elastic Beanstalk 上似乎失败,它也已更新以与 6.0 分支兼容 确保 Elastic Beanstalk 环境中只有一个实例运行 Laravel 的调度器
许多人在使用 Amazon 的 Elastic Beanstalk 时遇到了一个常见问题,即维护一个环境中的单个实例来运行 Laravel 的任务调度器。由于自动扩展不保证任何实例会无限期运行,且环境中不存在“主从”关系来区分实例,因此会出现困难。
尽管 Amazon 提供了一个 解决方案,但需要设置工作层,然后可能需要创建新的路由/方法来实现需要运行的任务。真糟糕!
此软件包提供了一个简单、零配置的解决方案,用于在 Elastic Beanstalk 环境中维护一个运行任务调度器的实例。
它是如何工作的?
很高兴您问了!以下过程 完全自动化,只需将 .ebextensions
文件夹发布到应用程序的根目录。
1. 使用 Elastic Beanstalk 的高级配置来运行 CRON 设置命令
EB 应用程序可以包含一个 文件夹,该文件夹为 EB 环境提供高级配置,称为 .ebextensions
。
此软件包提供了一个配置文件,在部署时(每次实例初始化时)运行两个命令,以设置在单个实例上运行任务调度器所需的条件
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。
安装
需要此软件包
composer require "eis3nhorn/laravel-elasticbeanstalk-cron"
添加软件包后,将ServiceProvider添加到config/app.php中的providers数组
\eis3nhorn\LaravelElasticBeanstalkCron\ElasticBeanstalkCronProvider::class
然后,发布.ebextensions文件夹和配置文件。
php artisan vendor:publish --tag=ebcron
配置
为了使Leader Selection运行,必须存在几个环境变量
- USE_CRON = true -- 必须设置,以便Leader Selection可以发生。(这可以用于防止在不需要的环境中发生选择,例如Worker等。)
- AWS_ACCESS_KEY_ID -- 用于对ec2客户端进行只读访问
- AWS_SECRET_ACCESS_KEY -- 用于对ec2客户端进行只读访问
- AWS_REGION -- 设置使用ec2客户端时使用的AWS区域,如果未设置,默认为
us-east-1
。
这些可以包含在您的.env文件中,或者对于EB,在环境的配置部分。
贡献
为一些额外的功能制作一个PR,我将非常乐意接受它 :)
许可
此软件包受MIT许可许可。