aramirez92 / laravel-elasticbeanstalk-queue-worker
将 Laravel 应用程序作为 AWS ElasticBeanstalk 上的队列工作者进行部署
Requires
- illuminate/console: ~5.1
- illuminate/support: ~5.1
This package is auto-updated.
Last update: 2024-09-12 18:12:35 UTC
README
使用您的 L5 应用程序作为工作者在 AWS Elasticbeanstalk 上消费队列
Laravel 提供了一组 优秀的驱动程序,用于在您的应用程序中消费队列,以及如何将应用程序与 Supervisord 一起管理的文档。
不幸的是,文档在这里就结束了。没有关于如何从 DevOps 视角管理多个工作者的指导,这真是令人沮丧。但别担心,我已经为您准备好了。
此软件包使您的 L5 应用程序能够在一个 AWS Elasticbeanstalk 环境中作为工作者自我管理。
它提供以下功能
- 首次部署时自动安装 supervisor
- 部署时自动更新 supervisor 配置
- 提供两种 supervisor 配置部署选项
- 解析 EB 环境变量以生成 supervisor 配置
- 或使用项目提供的预构建 supervisor 配置
让我们进入正题
安装
需要此软件包
composer require "foxxmd/laravel-elasticbeanstalk-queue-worker"
安装软件包后,您可以选择
将 ServiceProvider 添加到 config/app.php
中的 providers 数组
FoxxMD\LaravelElasticBeanstalkQueueWorker\ElasticBeanstalkQueueWorkerProvider::class
然后,使用 artisan 进行发布
php artisan vendor:publish --tag=ebworker
或者
手动将 src/.ebextensions
中的所有内容复制到您自己的 .ebextensions
文件夹
注意: 此库仅包含 EB 部署步骤 -- provider 只是为了方便 -- 所以如果您愿意,您可以根据自己的喜好修改/合并 .ebextensions
文件夹,以免覆盖您的内容。
配置
启用工作者模式
为了使工作者部署处于活动状态,您必须将此环境变量添加到您的 elasticbeanstalk 环境配置中
IS_WORKER = true
如果此变量为 false 或不存在,则部署将不会运行
设置队列驱动程序
在您的 EB 环境变量中设置 驱动程序
QUEUE_DRIVER = [driver]
注意:如果您的 EB 环境变量中没有 QUEUE_DRIVER
键,则将使用 beanstalkd
。
添加队列
所有队列都使用以下语法的 EB 环境变量进行配置
注意:方括号仅用作占位符,不要在实际配置中使用它们
queue[QueueName] = [queueName] # Required. The name of the queue that should be run.
[QueueName]NumProcs = [value] # Optional. The number of instances supervisor should run for this queue. Defaults to 1
[QueueName]Tries = [value] # Optional. The number of times the worker should attempt to run in the event an unexpected exit code occurs. Defaults to 5
[QueueName]Sleep = [value] # Optional. The number of seconds the worker should sleep if no new jobs are in the queue. Defaults to 5
[QueueName]StartSecs = [value] # Optional. How long a job should run for to be considered successful. Defaults to 1
[QueueName]Delay = [value] # Optional. Time in seconds a job should be delayed before returning to the ready queue. Defaults to 0
为要运行的每个队列在您的 EB 环境变量中添加一个 queue[QueueName] = [queueName]
条目。其余参数是可选的。
就是这样!在您的下一次部署中,supervisor 将更新其配置/生成配置,并在您的队列上开始运行。
使用您自己的 supervisord.conf
使用您自己的预构建 supervisor 配置文件也很简单。
只需在发布的 elasticbeanstalkworker.php
配置文件中设置文件的位置
<?php return array( /* * The path of the supervisord.conf file to be used INSTEAD OF generating one from environmental variables. Note that this can be null if you do not have one. * * This path is RELATIVE to the root of your application. * EX: * Absolute Path: /Users/dev/coding/MyProject/config/mysupervisord.conf * Path to use: config/mysupervisord.conf */ 'supervisorConfigPath' => 'config/mysupervisord.conf` );
现在,在部署过程中,将使用您的配置文件而不是生成一个。
注意:您可以通过检查 EB 环境的 eb-activity.log
来验证部署过程是否检测并部署了您的文件。在日志中搜索 Starting supervisor configuration parsing.
。
它是如何工作的呢?
很高兴您问到了。这是一个简单的流程,但需要大量的尝试和错误才能正确完成(感谢 AWS 的文档不足)
EB应用程序可以包含一个提供EB环境高级配置的文件夹,称为.ebextensions
,该文件夹中可以包含一个文件夹。
此软件包使用此文件夹中的AWS命令文件来检测、安装和更新supervisor及其配置,然后为您运行它。
1. 入口supervisor规则
如果您想访问其Web监控器,则supervisor需要打开端口9001。这是一步可选操作,如果不使用,可以通过删除00supervisordIngress.config
来移除。
2. 解析队列配置
parseConfig.php
会查找配置中指定的用户提供的supervisord.conf
文件。如果存在,则使用该文件。
否则,parseConfig.php
会查找之前生成的包含所有为Elastic Beanstalk配置的环境变量的json文件。然后解析出任何找到的队列配置(请参阅上面的添加队列
部分),并为每个队列生成一个supervisor程序。要生成的程序如下所示
[program:$queue]
command=sudo php artisan doctrine:queue:work $connection --queue=$queue --tries=$tries --sleep=$sleep --daemon
directory=/var/app/current/
autostart=true
autorestart=true
process_name=$queue-%(process_num)s
numprocs=$numProcs
startsecs=$startSecs
解析完所有队列后,然后将程序附加到同一目录下干净的新supervisord.conf
文件中。
3. 部署supervisor
现在一个bash脚本workerDeploy.sh
检查EB环境变量中是否存在IS_WORKER=TRUE
。
- 如果没有找到,则脚本不执行任何操作并退出。
- 如果找到了
- 并且没有
init.d
脚本- 使用pip安装supervisor,并将此项目中的自定义
supervisord
init脚本复制到/etc/init.d
。 - 解析配置
- 启动supervisor
- 将supervisor设置为在启动时启动
- 使用pip安装supervisor,并将此项目中的自定义
- 如果存在
init.d
脚本- 停止supervisor
- 解析配置
- 使用Laravel artisan重新启动队列以刷新守护进程
- 使用新配置重新启动supervisor
- 并且没有
注意事项
这几乎是我为另一个项目设置的原始设置,因此一些使用受到原始编写方式的限制
- 如果没有显式设置,队列驱动默认为beanstalkd
- 目前无法在没有
--queue=[queue]
的情况下生成supervisor程序
尽管如此,这些都是简单的修复!请查看问题以查看这些问题以及其他问题,如果需要,请创建PR!
贡献
为额外的功能创建PR,我将非常乐意接受它 :)
许可证
此软件包在MIT许可证下授权。