首页 > 解决方案 > Sidekiq 如何使用 Rails 进程空间中的对象?

问题描述

我正试图围绕 Rails 应用程序中的后台进程执行。我有一个模型,我想根据要求在后台运行一个方法:

class MyController < ApplicationController
  def perform
    perform { MyModel.find(params[:id])&.my_method }
  end
end

Rails 的众多队列适配器允许我这样做。我选择了Sidekiq。这是我的工作课程:

class MyMethodJob < ApplicationJob
  def perform(id)
    MyModel.find(params[:id])&.my_method
  end
end

回到控制器我有

class MyController < ApplicationController
  def perform
    MyMethodJob.perform_later params[:id]
  end
end

我的理解是,这MyModel.find(params[:id])&.my_method实际上是由 Sidekiq 的一个工作线程在不同进程中执行的。在我看来,这意味着 Sidekiq 的进程必须知道MyModel类及其实例方法。我不明白不同的进程如何能够从我的 Rails 应用程序中成功操作 Ruby 对象。Sidekiq 是否也将我的 Rails 应用程序中的所有类加载到它的 ObjectSpace 中?归根结底,我希望能够做一些类似于 Sidekiq 所做的事情——在一个单独的进程中执行一项工作,同时能够使用我的 Rails 应用程序中的代码,并通过 Active Record 访问数据库。我觉得我对这实际上是如何工作的有一个概念性的误解,并且真的很想在你的帮助下弄清楚。

标签: ruby-on-railsrubymultiprocessingsidekiq

解决方案


推荐阅读