Я пытаюсь обернуться вокруг выполнения фонового процесса в приложении 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
и его методы экземпляра. Я не понимаю, как другой процесс может успешно манипулировать объектом Ruby из моего приложения Rails. Загружает ли Sidekiq все классы из моего приложения Rails в его ObjectSpace? В конце концов, я хотел бы иметь возможность сделать что-то похожее на то, что делает Sidekiq - выполнить работу в отдельном процессе, имея возможность использовать код из моего приложения Rails и получать доступ к базе данных через Active Record. Я чувствую, что у меня есть концептуальное недопонимание того, как это действительно работает, и очень хотел бы выяснить это с вашей помощью.