You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查指定对象ID是否存在Sidekiq Pro待执行任务?

用Sidekiq Pro检查实例ID对应的待执行任务

因为你使用的是Sidekiq Pro版本,官方提供的Unique Jobs功能是最可靠的解决方案,既可以自动避免重复任务,也能主动检查任务是否存在。

一、给Worker配置唯一性规则

首先修改你的ExampleWorker,通过sidekiq_options配置任务唯一性,指定以实例ID作为唯一标识:

class ExampleWorker
  include Sidekiq::Worker
  # 配置队列和唯一性规则
  sidekiq_options queue: 'default', 
                  unique: :until_executed, 
                  unique_args: ->(args) { [args[0]] }

  def perform(id)
    instance = Record.find_by(id: id)
    # ... 你的业务逻辑
  end
end

参数说明:

  • unique: :until_executed:表示同一个ID的任务,在执行完成前不会被重复加入队列
  • unique_args:指定用第一个参数(也就是实例ID)作为唯一判断的依据,确保相同ID只会有一个待执行任务

二、主动检查待执行任务(可选)

如果需要在调用perform_async前主动判断是否已有对应任务,可以用Sidekiq Pro提供的API查询:

# 生成当前实例ID对应的唯一任务键
unique_key = ExampleWorker.get_unique_key([inst.id])
# 检查该键是否存在于待执行任务的唯一集合中
task_exists = Sidekiq::UniqueJobs::UniqueSet.new.exists?(unique_key)

if task_exists
  # 已有待执行任务,执行你的自定义逻辑(比如跳过、打日志等)
else
  ExampleWorker.perform_async(inst.id)
end

注意:如果不需要主动判断,直接调用perform_async即可——Sidekiq Pro会自动忽略重复的任务请求,不会生成重复的待执行任务。

额外注意事项

  • 确保Sidekiq Pro的Unique Jobs功能已启用(默认安装后自动启用,无需额外配置)
  • 可以根据业务需求更换unique策略:比如:until_processing表示任务开始执行后就允许新增,:while_executing表示执行过程中不允许新增
  • 不要手动遍历队列查询任务,这种方式效率低且存在竞态条件,官方的Unique Jobs是基于Redis原子操作实现的,可靠性更高

内容的提问来源于stack exchange,提问作者AOS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:12:07