编程

Laravel 12.35 的 deferred 队列驱动

15 2025-10-31 01:44:00

介绍

Laravel 12.35 添加了一个名为 deferred 的新队列驱动,旨在在 HTTP 响应返回客户端后处理队列中的任务,所有操作均在同一个 PHP 进程内完成。

与依赖外部工作器的典型队列驱动(数据库、Redis、Sqs 等)不同,deferred 驱动允许你将非关键任务(例如发送电子邮件、日志记录或分析)推迟到请求完成为止。

deferred 队列驱动程序的工作原理

使用 deferred 队列驱动时,其底层机制如下:

  1. 你通常使用 dispatch() 来调度任务。
  2. 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);

以下是流程:

  1. Laravel 会先尝试将作业推送到数据库队列。
  2. 如果数据库队列连接失败,Laravel 会自动回退到延迟驱动程序。
  3. 延迟驱动确保作业在响应发送给用户后立即运行,即使主队列关闭,也能防止作业丢失。

这种混合设置既可靠快速

  • Job 通常由你的主队列系统(比如数据库 Worker)处理。
  • 如果系统不可用,由于延迟回退,作业会在响应后立即执行。

何时使用 Deferred 队列驱动

deferred 队列驱动非常适合以下情况:

  • 在请求后立即发送事务性电子邮件。
  • 在响应后日志记录分析或指标化。
  • 广播事件或通知不影响即时用户体验。
  • 所有短的、非关键任务在响应后运行,但无需专用 worker。

但是,请避免在以下情况下使用它:

  • 长时间运行或占用大量资源的作业。
  • 需要重试逻辑或分布式处理的任务(请使用 redis、sqs 或数据库)。

总结

Laravel 12.35 中引入的延迟(Deferred)队列驱动提供了一种简单而强大的方法,可以在 HTTP 响应发送后运行队列作业,而无需额外的设置或工作线程。

与故障转移(Failover)队列驱动配合使用时,它创建了一种安全高效的混合方法:响应后立即执行,并提供可靠的回退保护。