当前位置:首页 > 技术 > 正文内容

Laravel queue job 中 WithoutOverlapping 和 ShouldBeUnique 的区别

代码老兵 技术 5

这两个很容易混淆,但它们解决的是完全不同层级的问题

ShouldBeUnique = 防“重复入队”
WithoutOverlapping = 防“并发执行”


一、核心区别

机制阶段作用
ShouldBeUnique入队时队列里只能有一个
WithoutOverlapping执行时同一时间只能跑一个

二、ShouldBeUnique(唯一 Job)

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Queue\ShouldBeUnique;

class MyJob implements ShouldQueue, ShouldBeUnique
{
   public function uniqueId()
   {
       return 'user:1';
   }
}

行为

dispatch(new MyJob()); // ✓ 入队
dispatch(new MyJob()); // ✕ 被忽略

队列里只会有一个

  • dispatch 时生效

  • 用 cache 锁(Redis)

  • 防止重复任务堆积

适用场景

防止重复提交任务
同一用户只允许一个任务

三、WithoutOverlapping(执行互斥)

use Illuminate\Queue\Middleware\WithoutOverlapping;

public function middleware()
{
   return [
       new WithoutOverlapping('user:1')
   ];
}

行为

Job1 开始执行
Job2 来了 → 等待 or 释放(取决配置)

队列里可以有多个,但不会同时执行

  • handle 执行时生效

  • 基于 mutex lock 控制并发

可选配置

(new WithoutOverlapping('key'))->releaseAfter(10);

拿不到锁 → 10 秒后重试

四、最直观对比(重要)

没有控制

用户点 10 次按钮 → 10 个 Job
→ 全部执行 ✕

ShouldBeUnique

只进队列 1 个 ✓

WithoutOverlapping

进队列 10 个 ✓
但一次只执行 1 个 ✓

五、组合使

class MyJob implements ShouldQueue, ShouldBeUnique
{
   public function uniqueId()
   {
       return 'user:1';
   }

   public function middleware()
   {
       return [
           new WithoutOverlapping('user:1')
       ];
   }
}

效果

1. 防止重复入队
2. 防止并发执行

双保险 🔥

六、常见坑

1. ShouldBeUnique 会“悄悄失败”

dispatch(new MyJob());
dispatch(new MyJob());

第二个:

不会报错,只是 silently ignore ✕

2. WithoutOverlapping 需要 Redis

否则锁不可靠

3. uniqueId 不写 = 全局唯一

return 'fixed-key';

所有 Job 都被挡住 ✕

七、一句话总结


ShouldBeUnique:

不让重复进队列

WithoutOverlapping:

不让同时执行


标签: Laravelqueue

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。