Laravel如何使用队列延迟配合优先级调度_Laravel使用队列延迟配合优先级调度方法【调度】

陌伟酱_3589

陌伟酱_3589

2026-04-10

722人浏览

原创

Laravel 中需通过多队列+显式分发+多 Worker 权重配置实现延迟与优先级协同:一、按 high/default/low 队列分流并用 onQueue() 和 delay() 组合;二、用不同 --sleep/--max-jobs 启动独立 Worker;三、任务类设 $queue/$delay 属性固化默认策略;四、高阶场景可用 Redis ZSET 手动调度;五、周期性延迟任务可结合 schedule() 触发。

laravel如何使用队列延迟配合优先级调度_laravel使用队列延迟配合优先级调度方法【调度】

如果您希望在 Laravel 中实现任务既可延迟执行,又能在不同紧急程度下获得差异化的处理响应,则需将延迟机制与队列名维度的优先级调度协同设计。Laravel 原生不支持单任务级 priority 参数,但可通过多队列 + 显式分发 + 多 Worker 进程权重配置达成目标。以下是具体实施步骤:

一、基于多队列名称实现优先级分流

该方法利用 Laravel 队列系统对队列名(queue name)的原生识别能力,将高优、中优、低优任务分别推送到不同命名队列(如 high、default、low),再通过独立 Worker 进程监听并差异化调度节奏。此方式完全兼容 Laravel 的失败重试、延迟时间戳、事件钩子及 Horizon 监控体系。

1、在任务分发时显式指定队列名,并叠加 delay() 设置延迟时间:
dispatch(new ProcessOrder($order))->onQueue('high')->delay(now()->addMinutes(2));

2、对非紧急任务使用 low 队列并延长延迟窗口:
dispatch(new GenerateMonthlyReport($tenant))->onQueue('low')->delay(now()->addHours(24));

3、确保 config/queue.php 中 redis 连接未手动添加额外队列键(如 'sms' => []),仅复用 default 连接,靠 onQueue() 动态路由。

二、启动差异化权重的 queue:work 进程

为体现优先级,需启动多个独立 artisan queue:work 进程,每个进程绑定特定队列并配置 --sleep 与 --max-jobs 参数以控制轮询频率和上下文稳定性。高优队列进程应更激进地拉取任务,低优队列则降低资源争抢。

1、启动高优队列监听器,设置短休眠与高任务上限:
php artisan queue:work redis --queue=high --sleep=1 --max-jobs=200

2、启动默认队列监听器,平衡响应与稳定性:
php artisan queue:work redis --queue=default --sleep=3 --max-jobs=100

3、启动低优队列监听器,避免抢占资源:
php artisan queue:work redis --queue=low --sleep=10 --max-jobs=50

4、使用 Supervisor 管理全部进程,确保崩溃后自动重启;各进程必须使用唯一 process_name(如 laravel-worker-high)防止信号冲突。

三、在任务类中声明默认队列与延迟属性

为减少调用方重复指定,可在任务类内部通过 $queue 和 $delay 属性固化队列归属与基础延迟策略,使 dispatch() 调用更简洁且语义明确,同时保持与 delay() 方法调用的兼容性。

1、定义任务类并设置默认队列与延迟值:
class SendUrgentNotification implements ShouldQueue {
  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  public string $queue = 'high';
  public int $delay = 60;
  public function handle() { /* 发送即时通知 */ }
}

Laravel Cloud
Laravel Cloud

Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。

下载

2、分发时不指定队列或延迟,仍按默认执行:
SendUrgentNotification::dispatch($user);

3、如需覆盖默认延迟,仍可链式调用 delay():
SendUrgentNotification::dispatch($user)->delay(now()->addSeconds(5));

4、注意:$delay 属性仅在未调用 delay() 时生效;一旦调用 delay(),其参数将完全取代 $delay 值。

四、使用 Redis ZSET 手动构建混合优先级延迟队列(高级方案)

该方案绕过 Laravel 原生队列驱动,直接操作 Redis 有序集合(ZSET),以 score 字段复合编码「优先级权重 + 时间戳」实现细粒度排序。适用于对调度精度要求极高、且能承担运维复杂度的场景。但会主动放弃 Laravel 内置的失败重试、监控事件与 Horizon 集成能力。

1、在 dispatch 时手动写入 ZSET:
Redis::zAdd('queues:priority', time() + 600 + (1000 - $priority * 100), json_encode($jobData));

2、编写自定义 Worker 脚本,定期 ZRANGEBYSCORE 拉取 score ≤ time() 的任务:
while (true) {
  $ready = Redis::zRangeByScore('queues:priority', '-inf', time(), ['limit' => [0, 1]]);
  if ($ready) { Redis::zRem('queues:priority', $ready[0]); executeJob($ready[0]); }
  usleep(50000);
}

3、关键风险:此方式导致 failed_jobs 表不记录、tries 机制失效、Horizon 无法识别任务生命周期。

五、结合任务调度器触发延迟队列任务

当延迟需求具有固定周期性(如每日凌晨清理、每小时同步),可借助 Laravel 任务调度器 schedule() 主动分发带 delay() 的队列任务,避免长期运行的 Worker 进程依赖外部定时器,提升调度可控性与日志可追溯性。

1、在 app/Console/Kernel.php 的 schedule() 方法中添加:
$schedule->call(function () {
  dispatch(new ClearExpiredSessions)->delay(now()->addMinutes(5));
})->hourly();

2、确保服务器 crontab 已配置每分钟执行:
* * * * * cd /var/www/project && php artisan schedule:run >> /dev/null 2>&1

3、该方式下 delay() 的时间基准是 schedule:run 触发时刻,而非 cron 启动时刻,确保精度。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

877

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

855

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2508

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

4741

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

6930

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

4556

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

8529

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1516

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

215

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 221人学习

Composer手册
Composer手册

共0课时 | 0人学习