atymic/laravel-bulk-sqs-queue

Laravel SQS 批量队列

0.5.0 2024-07-20 01:08 UTC

This package is auto-updated.

Last update: 2024-09-20 01:33:01 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

安装

您可以通过 composer 安装此包

composer require atymic/laravel-bulk-sqs-queue

工作原理

默认情况下,Laravel 允许您通过 Queue::bulk() 方法或内置的 工作批处理 功能轻松执行一批作业。这两种方法都接受一个作业数组用于派发,并对每个作业进行循环,为每个作业发起一个 HTTP 请求。

当您派发少量作业时,这并没有问题,但较大的批次存在两个主要问题

  • 等待 1000 个 HTTP 请求(即使 SQS,延迟为 20-50 毫秒)需要两到五秒钟,这很慢!
  • SQS 按请求计费,并且它们支持最多 10 条消息的批处理,其成本与单个 sendMessage 调用相同。这可以节省 10 倍的成本!

但是 AWS SQS 有一个 批处理操作,允许您将最多 10 条消息组合成一个请求,以降低成本。在内部,这个包覆盖了批量方法来

  • 将作业分成每请求 10 个,或 200kb 的块(SQS 的最大限制是 256kb,包括请求开销等)
  • 异步派发这些批次,一次最多 $concurrency 个(默认 5)

这就差不多了。使用这个包,Laravel 队列系统应该与正常工作完全相同。您应该在应用程序和 AWS SQS 控板中获得相同的结果,但 AWS 账单会更小:)

用法

此包提供了一个名为 sqs-bulk 的队列连接器。在您的 queue.php 配置文件中,将其添加到 connections

'connections' => [
        'sqs-bulk' => [
            'driver'       => 'sqs-bulk',
            'key'          => env('AWS_ACCESS_KEY_ID'),
            'secret'       => env('AWS_SECRET_ACCESS_KEY'),
            'prefix'       => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue'        => env('SQS_QUEUE', 'default'),
            'suffix'       => env('SQS_SUFFIX'),
            'region'       => env('AWS_DEFAULT_REGION', 'us-east-1'),
            'after_commit' => false,
            'concurrency'  => 5, // Set the request concurrency, defaults to 5
        ],
]

然后您可以启动一个针对新 "连接" 和给定队列(默认队列可以用 SQS_QUEUE 覆盖)的队列工作进程

php artisan queue:work sqs-bulk --queue=default

它将处理推送到队列的新作业。您可以使用队列的批量方法对作业进行分组

Illuminate\Support\Facades\Queue::bulk([
    new \App\Jobs\Foo,
    new \App\Jobs\Bar,
    new \App\Jobs\Baz,
], '', 'default');

或者使用 Laravel 内置的 作业批处理 功能

Illuminate\Support\Facades\Bus::batch([
    new \App\Jobs\Foo,
    new \App\Jobs\Bar,
    new \App\Jobs\Baz,
])->name('My sqs batch')->onQueue('default')->dispatch();

它应该通过在 AWS SQS 上创建 3 条 "消息" 来处理 3 个作业,但只发起 1 个请求。

失败的作业

此包仅影响作业传输到 AWS SQS 的方式。一旦由 AWS SQS 接收,它们就被视为独立的消息。从 AWS SQS 的角度来看,消息之间没有关系。批量请求可能产生成功和失败操作的组合,这不会相互影响。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全漏洞

请参阅 我们的安全策略 了解如何报告安全漏洞。

致谢

许可证

MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。