Задать вопрос
@askhat

Как писать в БД внутри бекграунд воркера?

Я разрабатываю небольшую утилиту на Ruby. Её две основные задачи: переодичное выполнение HTTP запроса с сохраненим ответа в БД и отображение полученых данных в веб-интерфейсе.
В качестве инструментов я выбрал:
  • Sinatra - для веб-интерфейса
  • Mongoid - для дата маппинга
  • Sidekiq - фоновой задачи

И если с первым всё предельно ясно, то с последними двумя начинаются трудности. Внутри дескрайба класса воркера невозможно обратиться к модели (из-за unitialized constant AwesomeWorker::AwesomeModel, передать экземпляр модели в качестве аргумента воркеру также проблематично т. к. Sidekiq приводит все аргументы к String. Я сделал небольшой воркэраунд передавая в качестве аргумента воркеру object_id свежесозданной модели, а внутри воркера снова получаю экземпляр модели с помощью ObjectSpace._id2ref но это какой-то грязный хак (еще и не работает):
require 'sidekiq'
require 'awesome_model'
class AwesomeWorker
  include Sidekiq::Worker
  def perform model_id
    model = ObjectSpace._id2ref model_id
    model.update_attributes! { data_key: "data value" }
  end
end
AwesomeWorker.perform_async AwesomeModel.new.object_id.to_i

Почему мне так важен инвоук модели из воркера? Потому что инвоук инициируется не контроллером, а по времени.

Я правильно выбрал инструменты? Что я делаю не так? Как бы вы решали подобную задачу?
  • Вопрос задан
  • 258 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
viktorvsk
@viktorvsk
Ошибка же элементарная и не связана ни с какими перечисленными инструментами.
Что делать?
require 'sidekiq'
require 'awesome_model'
AwesomeModel # => ???
...

Если не ок, смотрите, почему у вас модель не загружается.
Если ок, тогда:
AwesomeWorker.perform_async ::AwesomeModel.new.object_id.to_i

два двоеточия перед классом или модулем заставляют искать его (класс или модуль) не в текущем контексте (модуля), а от самого начала (от Object). Но, на самом деле, мало вероятно.

P.S.
Я бы для этого взял Resque:
1. Никогда никаких проблем не было, заводился сразу
2. Процесс рождается и умирает (когда плюс, когда минус. В моем случае - был плюс, потому что процесс в работе становился очень жирным и не выгружался в случае с DJ или Sidekiq, а в Resque заканчивал работу, умирал и освобождал память)
3. Поддерживается гитхабом и хероку
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mainameiz
@mainameiz
Full-stack web-developer
Неплохо бы показать файлик 'awesome_model'.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы