foxxmd/laravel-elasticbeanstalk-queue-worker

将您的 Laravel 应用程序作为队列工作者部署到 AWS ElasticBeanstalk

1.0.0 2022-06-28 12:49 UTC

This package is auto-updated.

Last update: 2024-08-29 04:26:52 UTC


README

使用您的 Laravel 应用程序作为工作者在 AWS Elasticbeanstalk 上消费队列

Laravel 提供了一组优秀的驱动程序,用于在您的应用程序中消费队列,以及一些文档,说明如何在应用程序作为工作者时使用 Supervisord 进行管理。

不幸的是,文档就到这里结束了。没有关于如何从 DevOps 上下文中管理多个工作者的指导,这确实很令人沮丧。但别担心,我已经为您准备好了。

此包使您的 Laravel 应用程序能够在 AWS Elasticbeanstalk 环境中作为工作者进行自我管理。

它提供以下功能

  • 首次部署时自动安装 supervisor
  • 部署时自动更新 supervisor 配置
  • 两种 supervisor 配置部署选项
    • 解析 EB 环境变量以生成 supervisor 配置
    • 或使用项目中提供的预构建 supervisor 配置

Amazon Linux 1 弃用

Amazon Linux 1 (AL1) 将很快不再受支持,建议迁移到使用 Amazon Linux 2 (AL2) https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.migration-al.html 从本版本开始将仅支持 AL2,请使用先前版本用于 AL1

让我们开始吧

安装

需要此包

composer require "foxxmd/laravel-elasticbeanstalk-queue-worker"

或对于 Amazon Linux 1,

composer require "foxxmd/laravel-elasticbeanstalk-queue-worker@^0.3"

安装包后,您可以选择

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

FoxxMD\LaravelElasticBeanstalkQueueWorker\ElasticBeanstalkQueueWorkerProvider::class

然后,使用 artisan 进行发布

php artisan vendor:publish --tag=ebworker

OR

src/.ebextensions 中的所有内容手动复制到您的 .ebextensions 文件夹,以及将 src/.platform 中的所有内容复制到您的 .platform 文件夹

注意:此库仅包含 EB 部署步骤 -- provider 仅用于方便 -- 因此,如果您愿意,您可以在不覆盖您的内容的情况下修改/合并 .ebextensions / .platform 文件夹。

别忘了给 EB 平台钩子脚本添加 +x 权限

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

配置

启用工作者模式

为了使工作者部署生效,您 必须 将此环境变量添加到您的 elasticbeanstalk 环境配置中

IS_WORKER = true

如果此变量为 false 或不存在,则部署将不会运行

设置队列驱动程序/连接

在您的 EB 环境变量中设置 驱动程序

QUEUE_DRIVER = [driver]

由于 Laravel 5.7,变量名称已更改,因此也将支持新的名称

QUEUE_CONNECTION = [driver]

添加队列

所有队列都使用以下语法通过 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

为每个您想要运行的队列添加一个 queue[QueueName] = [queueName] 条目到您的 EB 环境变量中。其余参数是可选的。

就这样!在您的下一次部署中,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-hooks.log 来验证部署过程是否检测并部署了您的文件。在日志中搜索 Starting supervisor configuration parsing.

但它是如何工作的呢?

很高兴你问了。这是一个简单的流程,但需要大量的试错才能正确设置(感谢 AWS 缺乏文档)

EB 应用程序可以包含一个提供 EB 环境高级配置的 文件夹,称为 .ebextensions

从 AL2 开始,EB 应用程序可以包含提供 EB 环境钩子脚本的 平台钩子,称为 .platform

这个包使用此文件夹中的 AWS 命令文件来检测、安装和更新 supervisor 及其配置,然后为您运行它。

1. 入口 Supervisor 规则

如果想要访问其 Web 监视器,则需要 Supervisor 打开端口 9001。这是一个可选步骤,如果不使用,可以通过删除 00supervisordIngress.config 来移除。

2. 解析队列配置

parseConfig.php 会寻找配置中指定的用户提供的 supervisord.conf 文件。如果存在,则使用该文件。

否则,parseConfig.php 会寻找之前生成的包含所有为 Elastic Beanstalk 配置的环境变量的 json 文件。然后它会解析出任何找到的队列配置(请参阅上面“添加队列”部分),并为每个配置生成一个 supervisor 程序,同时为每个程序提供 EB 设置的所有环境变量。要生成的程序如下所示

[program:$queue]
command=php artisan 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
user=webapp
environment=$environmentVal

解析完所有队列后,它将程序追加到同一目录中的干净 supervisord.conf 文件中。

3. 部署 Supervisor

现在,bash 脚本 workerDeploy.sh 会检查 EB 环境变量中的 IS_WORKER=TRUE

  • 如果没有找到,则脚本不执行任何操作并退出。
  • 如果找到了
    • 并且没有 init.d 脚本
      • 使用 pip 安装 Supervisor,并将本项目中的自定义 supervisord 初始化脚本复制到 /etc/init.d
      • 解析配置
      • 启动 Supervisor
      • 将 Supervisor 设置为在启动时启动
    • 并且有一个 init.d 脚本
      • 停止 Supervisor
      • 解析配置
      • 使用 Laravel artisan 重启队列以刷新守护进程
      • 使用新的配置重新启动 Supervisor

注意事项

请查看问题,如果需要,请提交一个 PR!

贡献

为额外的功能创建一个 PR,我会很高兴接受它 :)

许可

此包根据 MIT 许可证 许可。