Laravel 任务和队列 101:队列连接、使用多个队列以及设置优先级

发布时间:作者:

Laravel Jobs and Queue 101: queue connections, using multiple queues, and setting up priorities image

现在您已经了解了本系列文章第一部分中介绍的 Laravel 中任务和队列的基本知识,让我们来学习如何使用不同的队列连接(除了数据库连接之外),如何使用多个不同的队列来处理不同的任务,以及如何将某些任务/队列的优先级设置得更高。

使用 RabbitMQ

虽然 Laravel 社区中选择 Redis 作为数据库以外的队列连接的“默认”选择,但我们将使用 RabbitMQ 来代替。

我选择使用 RabbitMQ 的原因如下

  • 与 RabbitMQ 相比,其他队列连接的文档比较完善(请查看 https://laravel.net.cn/docs/6.x/horizon,这是 Laravel 用于 Redis 队列的官方软件包)。
  • 根据我的经验,我发现 RabbitMQ 比其他队列连接更出色。
  • 如果您正在阅读本文,那么您很有可能是刚刚接触任务和队列的世界,因此最好先专注于学习如何处理它们,而不必过多地关注如何安装 Redis,以及如何在本地机器和生产环境中使其正常工作。使用 RabbitMQ,我们可以利用第三方服务来托管和管理我们的 RabbitMQ 实例。我首选的服务是 cloudAMQP.com。它的免费试用版对于本教程以及许多您将要进行的副项目来说已经足够了(每月 100 万个任务,100 个队列等等)。

设置队列

访问 cloudamqp.com,注册并创建一个 Little Lemur 实例。

创建实例后,您将获得其详细信息,如下所示

现在我们需要让 Laravel 知道我们要将任务推送到 RabbitMQ 而不是数据库。

首先,我们需要添加以下软件包:vladimir-yuldashev/laravel-queue-rabbitmq

composer require vladimir-yuldashev/laravel-queue-rabbitmq

之后,我们需要将以下连接添加到 config/queue.php 文件中

'rabbitmq' => [
 
'driver' => 'rabbitmq',
'queue' => env('RABBITMQ_QUEUE', 'default'),
'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class,
 
'hosts' => [
[
'host' => env('RABBITMQ_HOST', '127.0.0.1'),
'port' => env('RABBITMQ_PORT', 5672),
'user' => env('RABBITMQ_USER', 'guest'),
'password' => env('RABBITMQ_PASSWORD', 'guest'),
'vhost' => env('RABBITMQ_VHOST', '/'),
],
],
 
'options' => [
'ssl_options' => [
'cafile' => env('RABBITMQ_SSL_CAFILE', null),
'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
],
],
 
/*
* Set to "horizon" if you wish to use Laravel Horizon.
*/
'worker' => env('RABBITMQ_WORKER', 'default'),
 
],

然后我们需要更新 .env 文件,如下所示

QUEUE_CONNECTION=rabbitmq
RABBITMQ_DSN=amqp://
RABBITMQ_HOST=woodpecker.rmq.cloudamqp.com
RABBITMQ_VHOST=ojydhdau
RABBITMQ_USER=ojydhdau
RABBITMQ_PASSWORD=Bctt-m_WhXrWdNGcb1L5D7D5j-3j-8Gc
RABBITMQ_QUEUE=jobs

PS: QUEUE_CONNECTION 变量已经存在于 .env 文件中,因此请确保更新现有的变量。

在我们测试新配置之前,让我们执行以下操作

让我们打开 RabbitMQ 管理器,并检查是否已创建任何队列和任务。

如您所见,我们没有任何队列或任务。

现在,在我们发送任何新的请求之前,我们需要重新启动本地 Web 服务器,以便考虑新的 .env 文件更改。

现在,如果您向应用程序发送新的 POST 请求,我们会注意到以下情况

当我们切换到队列选项卡时,我们会注意到已创建了一个新的队列。

请注意,队列的状态为 空闲,一旦我们执行 queue:work 命令,状态将更改为 正在运行,并且任务将被消耗。

PS: 当使用 RabbitMQ 时,您无需手动检查队列工作进程是否正在运行,您只需检查队列的状态(如果它们为“空闲”,则表示它们没有运行)。

使用多个队列

现在想象一下,您已经部署了您的应用程序,并将其公开发布。另一个可以从队列中受益的任务是向新注册的用户发送欢迎电子邮件。

您可能想要将此任务委派给队列的原因之一是,您很可能会使用第三方服务来发送电子邮件,并且您不希望让用户等待电子邮件发送完成,然后才能将他们重定向到应用程序仪表板。

这个过程与处理传入的 POST 请求类似,每次我们想要发送一封新电子邮件时,它都会被排队,然后在后台处理。

在这个阶段,您会注意到所有任务都排队在同一个名为 jobs 的队列中(请记住,我们在 .env 文件中有一个变量 RABBITMQ_QUEUE=jobs)。

如果我们没有指定要调度任务的队列名称,Laravel 就会将它们发送到默认队列。但是我们也可以将每种类型的任务发送到特定的队列。

// This job is sent to the default queue...
Job::dispatch();
 
// This job is sent to the "emails" queue...
Job::dispatch()->onQueue('emails');

现在,每当用户注册时,新的 WelcomeEmail 任务就会被调度到 emails 队列。

为了消耗任务,我们有两个选择

我们可以打开一个新选项卡,运行 queue:work 命令,并专门监听这个队列。

php artisan queue:work –queue=emails

或者,我们可以在同一个选项卡中消耗这两个队列,但是这里我们将为每个队列设置优先级。例如,如果我们想先消耗 jobs 队列中的所有任务,然后再处理任何电子邮件,我们可以执行以下操作

php artisan queue:work --queue=jobs,emails

PS: 当您将应用程序部署到生产服务器时,您可能不需要设置优先级,因为我们将分别在后台进程中处理每个队列。

下一步是什么?

如果您已经完成所有步骤,那么您现在就可以将应用程序部署到生产服务器了。

在下一篇文章中,我们将探讨如何在远程服务器上运行工作进程,因为我们不能一直保持终端选项卡打开来消耗任务。

Youghourta Benali photo

后端开发人员 http://youghourta.com 我开发了

  • botmarker.com
  • bookmarkingBot.com
  • todocol.com

我也是“Laravel 测试 101”的作者 http://laraveltesting101.com

分类
Cube

Laravel 新闻

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等内容。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成以及本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

No Compromises

Joel 和 Aaron,两位来自 No Compromises 播客的经验丰富的开发人员,现在可以为您的 Laravel 项目提供服务。 ⬧ 固定价格 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100%退款保证。

No Compromises
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

使用旧版 Laravel?立即自动执行 Laravel 升级和代码现代化,以保持应用程序的更新。

Shift
Bacancy logo

Bacancy

仅需每月 2500 美元,即可为您的项目配备一位拥有 4-6 年经验的资深 Laravel 开发人员。获取 160 小时的专业知识和 15 天的免费试用期。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、即用型组件、统计信息、博客、文档等。

SaaSykit:Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,助力企业成功。

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。在使用熟悉的 Eloquent API 的同时,支持事务性、搜索、分析和移动用例。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包为您的 Laravel 应用程序添加评论

阅读文章