dnxlabs/laravel-queue-aws-batch

Laravel Queue for AWS Batch,允许用户将作业提交到Batch队列进行处理。


README

Latest Version on Packagist Software License Build Status Code Coverage

支持版本

安装

请参阅上表中的包版本信息,并根据需要进行相应更改。

将自定义仓库添加到您的composer json

    "require": {
        "dnxlabs/laravel-queue-aws-batch": "~3.0.0"
    },
    "repositories": [
        {
            "type": "vcs",
            "url":  "git@github.com:dnxlabs/laravel-queue-aws-batch.git"
        }
    ]

使用composer,运行

composer require dnxlabs/laravel-queue-aws-batch ~3.0

使用方法

  1. 您的Laravel应用程序需要被docker化并推送到您选择的容器注册库。应将ENTRYPOINT设置为artisan

  2. 将新的队列添加到您的config/queues.php配置文件的connections数组中

    [
        'batch' => [
            'driver' => 'batch',
            'table' => 'jobs',
            'queue' => 'first-run-job-queue',
            'jobDefinition' => 'my-job-definition',
            'expire' => 60,
            'region' => 'us-east-1'
        ]
    ]

此队列传输依赖于能够将其队列作业写入数据库队列。在这个例子中,它将作业写入到jobs表。您需要使用artisan queue:table来创建一个迁移来创建此表。

  1. 创建一个与queue配置设置同名AWS Batch作业队列。这是批处理连接器将您的作业推入批处理的地方。在这种情况下,我的队列名称将是first-run-job-queue

  2. 为每个定义的队列创建一个类似以下的AWS Batch作业定义

{
    "jobDefinitionName": "my-laravel-application",
    "type": "container",
    "parameters": {},
    "retryStrategy": {
        "attempts": 10
    },
    "containerProperties": {
        "image": "<your docker image>",
        "vcpus": 1,
        "memory": 256,
        "command": [
            "queue:work-batch",
            "Ref::jobId",
            "--tries=3"
        ],
        "volumes": [],
        "environment": [],
        "mountPoints": [],
        "ulimits": []
    }
}

在此处,您配置您的容器启动,运行queue:work-batch命令(假设artisan是您的入口点)并传递队列名称,first-run-job-queue以及Ref::jobId参数,该参数是在批处理连接器创建作业时传递的。

如果您提供了该参数,您需要配置一个具有比您运行的tries更多的"尝试"次数的重试策略。否则,如果作业失败,批处理将不会重试您的作业。Laravel 5.1在作业失败超过next次运行之前不会写入失败的作业队列。较新版本将在同一运行中写入队列,因此此要求可以稍后放宽。

  1. 将服务提供程序添加到您的应用程序中
    • config/app.php中将以下内容添加到providers数组中:DNXLabs\LaravelQueueAwsBatch\BatchQueueServiceProvider::class

限制

延迟作业

AWS Batch没有延迟作业的方法,作为我们的运行者,我们没有简单的解决方案。如果您需要延迟作业来满足您的使用情况,目前我的建议是使用常规DB队列,并触发一个作业进入它,以便在正确的时间触发批处理作业。