aramirez92/laravel-elasticbeanstalk-queue-worker

将 Laravel 应用程序作为 AWS ElasticBeanstalk 上的队列工作者进行部署

0.2.1 2016-12-21 19:16 UTC

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设置为在启动时启动
    • 如果存在init.d脚本
      • 停止supervisor
      • 解析配置
      • 使用Laravel artisan重新启动队列以刷新守护进程
      • 使用新配置重新启动supervisor

注意事项

这几乎是我为另一个项目设置的原始设置,因此一些使用受到原始编写方式的限制

  • 如果没有显式设置,队列驱动默认为beanstalkd
  • 目前无法在没有--queue=[queue]的情况下生成supervisor程序

尽管如此,这些都是简单的修复!请查看问题以查看这些问题以及其他问题,如果需要,请创建PR!

贡献

为额外的功能创建PR,我将非常乐意接受它 :)

许可证

此软件包在MIT许可证下授权。