小编典典

Sidekiq工作条件

redis

在我的应用程序中,我有25个工作人员,这些工作人员被不同用户的操作随机使用。

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

不能在控制器上将其阻止,因为其思想不是阻止动作的创建。需要创建动作,但动作要排队,直到处理同一用户的所有previos请求,然后才为该同一用户(重新)分配一个工作程序。

同时,如果另一个用户请求创建作业,则在剩余的24个工人中至少有一个可用时,它应该立即启动。

有什么方法可以查找队列行并使用其参数来建立处理条件?

谢谢


阅读 299

收藏
2020-06-20

共1个答案

小编典典

您可以使用Sidekiq Unique Jobs

通过这种方法,将仅同时显示具有相同参数的一项工作。

所以创建模型

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)
2020-06-20