Laravel 12.35 的 deferred 队列驱动
介绍
Laravel 12.35 添加了一个名为 deferred 的新队列驱动,旨在在 HTTP 响应返回客户端后处理队列中的任务,所有操作均在同一个 PHP 进程内完成。
与依赖外部工作器的典型队列驱动(数据库、Redis、Sqs 等)不同,deferred 驱动允许你将非关键任务(例如发送电子邮件、日志记录或分析)推迟到请求完成为止。
deferred 队列驱动程序的工作原理
使用 deferred 队列驱动时,其底层机制如下:
- 你通常使用
dispatch()来调度任务。 - HTTP 响应发送给用户后,Laravel 会自动在同一 PHP 进程内同步处理这些
deferred任务。
配置
要是 deferred 队列驱动,请在 config/queue.php 文件中添加新连接:
'connections' => [
'deferred' => [
'driver' => 'deferred',
],
],在 .env 中全局设置:
QUEUE_CONNECTION=deferred然后,在代码中,你可以:
SendWelcomeEmail::dispatch($user);将 Deferred 与故障转移队列驱动相结合
你可以将 deferred 驱动与 Laravel 的故障转移(failover)队列驱动结合使用,以确保最高的可靠性。
在此设置中,Laravel 将首先尝试将作业推送到主数据库队列。如果推送失败(例如,由于临时连接问题),它将回退到延迟(deferred)驱动,以确保作业在 HTTP 响应发送后仍能立即运行。
以下是在 config/queue.php 中配置它的方法:
'connections' => [
'failover' => [
'driver' => 'failover',
'connections' => ['database', 'deferred'],
],
],然后,在 .env 文件中:
QUEUE_CONNECTION=failover现在,当你发送任务:
SendWelcomeEmail::dispatch($user);以下是流程:
- Laravel 会先尝试将作业推送到数据库队列。
- 如果数据库队列连接失败,Laravel 会自动回退到延迟驱动程序。
- 延迟驱动确保作业在响应发送给用户后立即运行,即使主队列关闭,也能防止作业丢失。
这种混合设置既可靠又快速:
- Job 通常由你的主队列系统(比如数据库 Worker)处理。
- 如果系统不可用,由于延迟回退,作业会在响应后立即执行。
何时使用 Deferred 队列驱动
deferred 队列驱动非常适合以下情况:
- 在请求后立即发送事务性电子邮件。
- 在响应后日志记录分析或指标化。
- 广播事件或通知不影响即时用户体验。
- 所有短的、非关键任务在响应后运行,但无需专用 worker。
但是,请避免在以下情况下使用它:
- 长时间运行或占用大量资源的作业。
- 需要重试逻辑或分布式处理的任务(请使用 redis、sqs 或数据库)。
总结
Laravel 12.35 中引入的延迟(Deferred)队列驱动提供了一种简单而强大的方法,可以在 HTTP 响应发送后运行队列作业,而无需额外的设置或工作线程。
与故障转移(Failover)队列驱动配合使用时,它创建了一种安全高效的混合方法:响应后立即执行,并提供可靠的回退保护。