[笔记] 关于任务队列在项目中的使用

本文总结来自 Web开发实战进阶:使用队列

什么时候使用队列

处理一个需求中,属于优化而非必须的功能时,可以使用队列来完成。
队列允许你异步执行消耗时间的任务,这样可以有效降低请求响应的时间。

1. 配置队列

队列的配置信息保存在 config/queue.php 中。
队列的驱动包括:数据库、Beanstalkd、Amazon SQS、Redis 和同步(本地使用)的驱动。声明为 null 时表示不使用队列任务。
本次教程中,使用 Redis 作为队列驱动,需要先安装相关依赖:

$ composer require "predis/predis:~1.0"

然后修改 .env 文件中的环境变量 QUEUE_DRIVER 的值为 redis

失败任务

队列任务执行失败后,会进行重试,当重试次数超过指定的任务重试最大次数后,会将失败的任务信息写入 failed_jobs 表中。使用 php artisan queue:failed-table 指令来创建 failed_jobs 表的迁移文件,随后执行迁移。

$ php artisan queue:failed-table
$ php artisan migrate

2. 生成任务类

使用 make:job Artisan 指令来创建一个新的队列任务,该指令会在 app/Jobs 下生成一个新的类

$ php artisan make:job JobName

该类会实现 Illuminate\Contracts\Queue\ShouldQueue 接口,该接口表明 Laravel 应该将任务添加到后台的任务队列中,而非同步执行。
引入 SerializesModels trait, Eloquent 模型会被优雅的序列化和反序列化。construct 将会序列化模型ID,执行任务时,会从数据库中根据 ID 检索出模型实例。
handle 方法将在任务执行时被调用。且为了避免出现模型监控器的死循环,我们要使用 DB 类直接对数据库进行操作。

3. 任务分发

使用 dispatch 方法,可以将任务推送到队列。

4. 队列监控 Horizon

Horizon 是 Laravel 生态圈里的一员,为 Laravel Redis 队列提供了一个漂亮的仪表板,允许我们很方便地查看和管理 Redis 队列任务执行的情况。

使用 composer 安装:

$ composer require "laravel/horizon:~1.0"

安装完成后,使用 vendor:publish Artisan 命令发布配置文件 config/horizon.php 和存放在 public/vendor/horizon 文件夹中的CSS、JS 等页面资源文件。

$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

使用指令 php artisan horizon 即可监控队列任务的执行,浏览器中打开 http://larabbs.test/horizon 即可通过可视化界面监控队列任务的状态。

线上部署

在生产环境使用队列需要注意以下两个问题:

  1. 使用 Supervisor 进程工具进行监控 php artisan horizon 指令的执行,以便进程意外退出时能自动重启,配置和使用参照 Horizon文档

  2. 每一次部署代码时,需先执行 artisan horizon:terminate 然后再执行 artisan horizon 重新加载代码。

本作品采用《CC 协议》,转载必须注明作者和本文链接
JasonG
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!