如何检查指定对象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
相关产品推荐
相关产品推荐

