Sidekiq作业执行上下文

时间:2014-08-15 15:49:32

标签: ruby-on-rails-4 sidekiq

我想在后台执行一些任务,但有点像“run as”。换句话说,就像用户从他的会话环境中启动了一个任务。

这样的东西
def perform
    env['warden'].set_user(@task_owner_user)
    MyService::current_user_dependent_method
end

但我不确定它是否会与其他任务发生冲突。我对Sidekiq不太熟悉。 我可以安全地执行单独的任务,每个任务都有不同的用户上下文吗?

2 个答案:

答案 0 :(得分:2)

我不确定您使用“run as”上下文拍摄的是什么,但我总是通过在表演中传递id来设置需要唯一对象的sidekiq作业。通过这种方式,工作人员始终知道它正在尝试处理哪个对象。也许这就是你要找的东西?

    def perform id
        user = User.find(id)
        user.current_user_dependent_method
    end

然后在控制器中设置路径以触发此工作人员启动,例如:

  def custom_route_for_performing_job
    @users= User.where(your_conditions)
    @users.each do |user|
      YourWorker.perform_async user.id
    end
    redirect_to :back, notice: "Starting background job for users_dependent_method"
  end

答案 1 :(得分:1)

正确的设计是使用服务器端中间件+线程局部变量来设置每个作业的当前用户上下文。

class MyServerMiddlware
  def call(worker, message, queue)
    Thread.current[:current_user] = message['uid'] if message['uid']
    yield
  ensure
    Thread.current[:current_user] = nil
  end
end

您将创建一个客户端中间件来捕获当前的uid并将其放入消息中。通过这种方式,逻辑被明确地封装在任何一种类型的Worker中。阅读更多:

https://github.com/mperham/sidekiq/wiki/Middleware