Долго бьюсь и не могу разобраться с фоновыми задачами на Rails. Как я понял более менее затратное приложение нет смысла деплоить на хироку (если задач больше одной) или я не прав?)
Второе, как это реализовывать с помощью sidekiq? Есть какое-то руководство по его настройке на удаленном сервере или на том же Heroku?
Мой опыт с Heroku не совсем удачный, когда запускаешь через консоль bundle exec sidekiq он автоматически запускает все имеющиеся воркеры, как с этим быть? Или не нужно даже этого делать, а просто вызывать воркер через rake или контроллер приложения?
Sidekiq работает так: ты запускаешь его на сервере, он поднимает заданное количество воркеров и ждёт пока не появятся новые задачи. Потому такие задачи и называются фоновыми.
Александр Гончурин: Вообще не понимаю о чём ты говоришь. Мы точно об одмно и том же sidekiq говорим?
Sidekiq это обработчик задач. Ты из своего руби приложение, запускаешь задачу и она испо,лняется сайдкиком асинхронно, то есть не блокируя твой поток исполнения.
Например, ты при регистрации пользователя мы хотим показать ему сообщение что всё прошло хорошо и отправить сообщение с подтверждением регистрации.
class UsersController
def create
user = User.create!(params)
UserMailer.wellcome(user).deliver
render text: 'Супер! Проверьте почту и перейдите по ссылке'
end
end
Но что делать если не удастся отправить почту? Заставить пользователя отправлять форму ещё раз? А если и со второго раза не удастся? Тут то в дело вступает sidekiq. Он позволяет сразу показать пользователю текст и одновременно попытаться отправить ему письмо. Если попытка не удастся, то попробовать ещё раз и тд:
class WelcomeWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find(user_id)
UserMailer.wellcome(user).deliver
end
end
class UsersController
def create
user = User.create!(params)
WelcomeWorker.perform_async(user.id)
render text: 'Супер! Проверьте почту и перейдите по ссылке'
end
end
Если не хотите чтобы он запускал все воркеры, то нужно в воркерах прописывать название очереди и запускать сайдкик на обработку только этой очереди sidekiq -q queue_name (см. sidekiq --help)