-->

Sidekiq工作条件(Sidekiq work conditions)

2019-10-22 08:21发布

在我的应用程序有25名工人被随机使用不同的用户行为。

只有一个同时(活性/忙)的工作是由每个用户允许的。

它不能被阻挡在控制器上,因为想法是不阻止行为产生。 操作需要创建,但持有一行直至由同一用户所有previos请求进行处理,之后才是一个工人将(重新)-assigned为相同的用户。

如果另一个用户,在此期间,请求创造就业机会,它应该如果剩余的24名工人中的至少一个可瞬间启动。

有没有什么办法来寻找队列行并使用它的参数来构建加工条件?

谢谢

Answer 1:

您可以使用Sidekiq 独特的乔布斯

这种方法仅1个作业使用相同的PARAMS将同时存在。

所以建立模型

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)


文章来源: Sidekiq work conditions