Vapor:队列并发性

2023 年 1 月 30 日#vapor

使用 Laravel Vapor 时,可以在配置环境时指定应用程序使用多个队列。

id: 12345
name: my-project
environments:
    production:
    queue-concurrency: 100
    queues:
        - default
        - invoices
        - mail

在部署类似于上述示例的配置时,Vapor 将配置三个 SQS 队列(如果它们不存在),并在每个队列和消费 Lambda 函数之间设置事件映射,以确保处理所有作业。

所有已配置的队列在处理作业时使用相同的 Lambda 函数,这通常是因为 Lambda 几乎可以立即获取所有作业。

但是,这意味着所有队列共享函数配置的并发性,要么使用 vapor.yml 配置文件的 queue-concurrency 选项显式设置,如您在上述示例中看到的,要么默认情况下使用整个帐户并发性。

注意: 您可以在这篇文章中阅读有关 Lambda 并发性的更多信息。

如果您有一个繁忙的队列,消耗了您允许的大量并发性,您可能会发现来自其他队列的作业,甚至 HTTP 请求,开始受到 AWS 的限制。

感谢Lambda 和 SQS 的最新更新,我们很高兴地宣布这不再是一个问题。

简而言之,现在可以设置单个队列的并发性。

id: 12345
name: my-project
environments:
    production:
    queue-concurrency: 100
    queues:
        - default: 80
        - invoices: 10
        - mail: 10

查看上面的配置,您可以看到我们正在将整体队列函数并发性设置为 100,并在三个队列之间以我们期望的分布分配可用并发性。

这在底层做了什么?

以默认队列为例,在配置过程中,AWS 将在 SQS 和 Lambda 之间的映射上设置最大并发性为 80。

实际上,如果队列函数为默认队列处理足够的作业以达到并发性限制,那么 Lambda 函数将停止从队列中读取,而不是限制调用,直到有可用容量。因此,队列不再能够消耗所有资源,并且由于没有限制,因此重试策略不会生效,这意味着 SQS 不必决定如何处理受限制的作业。

Vapor 使得配置单个队列并发性变得轻而易举。例如,想象一个场景,我们有一个队列来处理视频,每个作业都可能使用 Lambda 最长 15 分钟的最大调用时间。我们希望防止此队列失控,因为它很容易消耗所有可用资源。

在此场景中,我们可以创建一个没有并发性限制的default队列。我们很高兴此队列上的作业将得到快速处理,并且不太可能达到并发性限制。我们还可以创建一个并发性限制为 2(AWS 允许的最小值)的videos队列,因为我们很乐意接受这些作业处理时间较长的权衡,并且确信它不会使我们环境的其余部分崩溃。

id: 12345
name: my-project
environments:
    production:
    queue-concurrency: 100
    queues:
        - default
        - video: 2

部署上述配置将执行此操作。就这么简单!

我们 Vapor 致力于打造最佳的无服务器 PHP 体验,我们希望您同意此功能是朝着正确方向迈出的又一步。我们期待并欢迎您可能提供的任何反馈。

作者:Joe Dixon

Laravel 软件开发者。

TwitterGitHub我的博客上找到我。

关注 RSS Feed