Sidekiq的工作条件

时间:2015-03-23 14:28:02

标签: ruby-on-rails-4 redis sidekiq

在我的应用程序中,我有25名工作人员,他们被不同的用户随机使用'动作。

每个用户只允许同时进行一次(主动/忙碌)工作。

它无法在控制器上被阻止,因为这个想法不是阻止动作创建。需要创建操作但保持一致,直到同一用户的所有主要请求都被处理,并且只有在此之后才会为同一用户(重新)分配一个工作者。

如果另一个用户同时请求创建一份工作,那么如果其余24名工作人员中至少有一名工作人员可用,则应该立即启动。

有没有办法查找队列行并使用其参数来构建处理条件?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用Sidekiq Unique Jobs

通过这种方法,只有1个具有相同参数的作业将同时存在。

所以创建模型

class UserJobs
  belongs_to :user
end

class User
  has_many :user_jobs
end

class Worker
  sidekiq_options unique: true

  def perform params
    user = User.find(params[:id])
    user.user_jobs.order('id asc').each do |job|
      job.worker_class.constantize.new.perform(job.params)
      job.destroy
    end
  end
end

比你需要为用户运行任何工作时:

user.user_jobs.create worker_class: Klass, params: params
Worker.perform_async(user_id: user.id)