在Sidekiq任务中,有时会出现重复运行的情况。为了避免这种情况,可以使用Sidekiq的unique_jobs插件。
gem 'sidekiq-unique-jobs'
require 'sidekiq-unique-jobs'
Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::UniqueJobs
end
end
class MyWorker
include Sidekiq::Worker
sidekiq_options unique: :until_executing
def perform(args)
# 任务代码
end
end
使用此选项后,Sidekiq会在执行任务前检查队列中是否有相同的任务,如果检测到,则不会将任务添加到队列中。
如果想要限制多个任务以不同的方式运行,可以使用unique_digest:
class MyWorker
include Sidekiq::Worker
sidekiq_options unique: :until_executing, unique_digest: ->(args) { args[0].to_s }
def perform(arg)
# 任务代码
end
end
unique_digest选项使用代码块来动态计算任务的唯一标识符。在此示例中,它将使用任务的第一个参数作为唯一标识符。
这样就可以避免重复的Sidekiq任务了。
上一篇:避免重复的数据库查询/将已加载的数据存储在静态变量中
下一篇:避免重复的随机值