我需要确保 25 个工作人员中的任何一个同时处理每个 user_id 的工作不超过一个,以避免死锁。
我已经尝试过 sidekiq 独特的作业,但死锁不断发生,因为它一直在尝试处理队列中所有待处理的作业,而不是在参数中查找 user_id。
谢谢
class MyWork
include Sidekiq::Worker
sidekiq_options :queue => "critical", unique: true,
unique_args: ->(args) { [ args.user_id ] }
def perform(work_params)
最佳答案
sidekiq_option args
是一个数组,其中第一个位置是您的 works_params
。然后你应该这样做:
class MyWork
include Sidekiq::Worker
sidekiq_options :queue => "critical", unique: until_executed,
unique_args: ->(args) { [ args.first.user_id ] }
def perform(work_params)
请注意,unique: true
已弃用,因此您应该使用 unique: until_executed
或任何最适合您的工作人员的方式。参见 here其他选项。
关于ruby-on-rails-4 - Sidekiq 独特的作业处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229687/