Laravel 的队列是框架中最强大的功能之一。使用 Vapor,您可以继续编写和调度队列作业,就像在传统的服务器托管 Laravel 应用程序中一样。唯一的区别是 Vapor 会在几秒钟内按需自动扩展您的队列处理吞吐量
use App\Jobs\ProcessPodcast;
ProcessPodcast::dispatch($podcast);
使用 Vapor 时,您的应用程序将使用 AWS SQS 服务,该服务已经是 Laravel 中的原生队列驱动程序。Vapor 会自动配置您的部署应用程序以使用此队列驱动程序,方法是注入适当的 Laravel 环境变量。您无需执行任何其他配置。
队列作业时间限制
目前,AWS 上的无服务器应用程序只能处理单个请求(Web 或队列)最多 15 分钟。如果您的队列作业花费的时间超过 15 分钟,您需要将作业的工作分成更小的部分,或者考虑为您的应用程序使用其他部署解决方案。此外,队列作业的“延迟”不能超过 15 分钟。
默认情况下,Vapor 会创建一个与您的项目同名的 SQS 队列,并注入适当的环境变量以使此队列成为默认队列。如果您想指定 Vapor 应该创建的自己的自定义队列名称,您可以在环境的 vapor.yml
配置中定义一个 queues
选项。队列列表中的第一个队列将被视为您的“默认”队列,并将自动设置为 SQS_QUEUE
环境变量
id: 2
name: vapor-laravel-app
environments:
production:
queues:
- emails
- invoices
使用自定义队列名称时,务必确保名称在项目和环境之间是唯一的。例如,您可以将 -staging
和 -production
等后缀值添加到应用程序 vapor.yml
文件中指定的队列名称中
id: 2
name: vapor-laravel-app
environments:
production:
queues:
- emails-production
- invoices-production
staging:
queues:
- emails-staging
- invoices-staging
由于在 Laravel 中将作业调度到特定队列时包含这些后缀很麻烦,因此 Laravel 的 sqs
队列配置包含一个 suffix
选项,默认情况下该选项引用 SQS_SUFFIX
环境变量。当定义了此选项和变量时,您可以在调度作业时提供不带后缀的队列名称,Laravel 会在与 SQS 交互时自动将后缀附加到队列名称
// Environment should include...
// SQS_SUFFIX="-production"
// Configuration...
'sqs' => [
'driver' => 'sqs',
// ...
'queue' => env('SQS_QUEUE', 'invoices'),
'suffix' => env('SQS_SUFFIX'),
// ...
],
// Dispatching...
SendInvoice::dispatch($invoice)->onQueue('invoices');
如果您的应用程序不使用队列,您可以将环境的 queues
选项设置为 false
id: 2
name: vapor-laravel-app
environments:
production:
queues: false
build:
- 'composer install --no-dev'
默认情况下,Vapor 允许您的队列以最大并发度处理作业,通常为 1,000 个并发作业同时执行。如果您想降低最大队列并发度,您可以在环境的 vapor.yml
配置文件中定义 queue-concurrency
选项
id: 2
name: vapor-laravel-app
environments:
production:
queue-concurrency: 50
build:
- 'composer install --no-dev'
使用多个自定义队列时,queue-concurrency
选项定义所有队列的总最大并发度。例如,如果您要定义两个自定义队列和一个 queue-concurrency
为 100,那么总最大并发度仍然为 100。
除了设置整体队列并发度之外,您还可以设置每个队列的最大并发度。如果您希望阻止某些队列消耗所有可用资源,这样做可能会有所帮助
id: 2
name: vapor-laravel-app
environments:
production:
queues:
- emails: 10
- invoices: 10
在上面的示例中,emails
和 invoices
队列的并发度为 10,这意味着如果队列 Lambda 函数正在并发处理十个作业,它将不会从队列中获取更多作业,直到作业完成并且容量可用。这种行为与总调用次数达到队列函数的总体容量时的行为不同,在这种情况下会发生节流。
您也可以在某些队列上设置最大并发度,而在其他队列上不设置。在下面的示例中,emails
队列不允许超过十个并发调用,而 invoices
队列可以一直调用,直到达到总体容量。
id: 2
name: vapor-laravel-app
environments:
production:
queues:
- emails: 10
- invoices
有效并发度
无法将单个队列的最大并发度设置为高于 queue-concurrency
选项或一般 AWS 帐户并发度限制设置的整体货币值。此外,并发度值必须是 2 到 1,000 之间的整数。
默认情况下,如果您的排队作业在开始处理后的 1 分钟内未被删除或释放,SQS 将重试该作业。要配置此“可见性超时”,您可以在环境的 vapor.yml
配置文件中定义 queue-timeout
选项。例如,我们可以将此超时设置为 5 分钟。
id: 2
name: vapor-laravel-app
environments:
production:
queue-timeout: 300
build:
- 'composer install --no-dev'
您可以在环境的 vapor.yml
配置文件中使用 queue-memory
选项来定义应提供给您的队列工作程序 Lambda 函数的内存。
id: 2
name: vapor-laravel-app
environments:
production:
queue-memory: 1024
build:
- 'composer install --no-dev'
默认情况下,数据库连接不会在排队作业之间持久化,以确保数据库不会因活动连接而不堪重负。但是,如果您的数据库可以处理大量连接,并且您希望减少在每个作业上创建数据库连接所涉及的开销,您可以在环境的 vapor.yml
配置文件中定义 queue-database-session-persist
选项,以指示 Vapor 在作业之间重用相同的数据库连接。
id: 2
name: vapor-laravel-app
environments:
production:
queue-database-session-persist: true
build:
- 'composer install --no-dev'
您可以直接从 Vapor 仪表板监控排队作业,方法是导航到任何环境的“队列”选项卡。在这里,您可以查看队列的执行情况,以及有关一段时间内处理的作业数量、正在进行的作业数量和失败的作业数量的详细信息。您可以通过选择特定队列和时间段来细化结果。
如果您在选定时间段内遇到作业失败,您可以通过单击“查看失败作业”链接进一步检查它们。这样做会向您展示一个失败作业列表,以及故障快照。您可以通过选择特定队列和时间段或提供搜索词来进一步过滤结果。单击条目会显示完整的有效负载和堆栈跟踪。从这里,您也可以重试或删除作业。
版本要求
为了查看 Vapor 仪表板中失败作业的详细信息,您的应用程序必须运行 Vapor Core >= v2.29.0。
Vapor 会自动使用您环境中配置的缓存驱动程序跟踪失败的作业尝试。这使 Vapor 能够确保您的应用程序可以访问正确的失败尝试次数,即使排队的作业由于超过 Lambda 强制执行的最大执行时间(15 分钟)而无法完成,或者由于未处理的异常导致处理作业的整个容器失败。
高容量队列
处理大量排队作业的应用程序在使用 DynamoDB 缓存驱动程序时可能会注意到 AWS 费用的增加。在这种情况下,我们建议使用 Redis 缓存。