eis3nhorn/laravel-elasticbeanstalk-cron

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

0.3 2017-10-12 12:53 UTC

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许可许可。