Как умело работать с Sidekiq и очередями?

Очень долго бьюсь и не могу никак понять суть работы. Что хочу сделать: работа с интсграм (подписки и лайки), выбираем хештеги и приложение наше начинает работать, делаем несколько задач, под разные аккаунты; в принципе это работает, но...

SIdekiq при запуске запускает все worker'ы и job'ы, что не требуется в самом начале. Как правильно вызывать и добавлять очереди. Долго бьюсь, понять не могу (мануал читал и что-то не получается).
  • Вопрос задан
  • 15084 просмотра
Решения вопроса 1
@bmalets
Коротко про суть - в общем любой сайт должен возвращать страничку на клиент < 3 секунд. То есть рельсы должны быстро обработать запрос и вернуть ответ. Отправка почты или "работа с инстаграм" - довольно сложные для обработки задания, которые замедлят скорость HTTP-ответа. Если "тяжелую" часть работы отдать на sidekiq, то то этой проблемы не возникнет.

Sidekiq использует Redis для хранения очередей.
В папке /app/workers/ размещаешь нужные для тебя воркеры. Например:

# app/workers/hard_worker.rb
class HardWorker
  include Sidekiq::Worker

  def perform(name, count)
    puts 'Doing hard work'
  end
end

(метод перформ как точка входа нужен обезательно, название файла и класса должны заканчиваться на 'worker', ну и конечно же include Sidekiq::Worker тоже нужно).

Когда sidekiq запущен, можешь из любой точки в коде проекта вызывать:

HardWorker.perform_async('bob', 5)

Что создаст новое "задание" для sidekiq и добавит его в очередь. Собственно, по мере обработки job-ов sidekiq выполнит поставленое ему задание - достанет его из очереди и воркер его выполнит. Больше воркеров - быстрее обработка, количество воркеров можна задать как аргумент при запуске sidekiq.

P.S. Скорее всего ты сделал ошибку в воркере или неправильно делаешь вызов. Добавь свой код к вопросу.
+ посмотри рейлскаты на эту тему railscasts.com/episodes/366-sidekiq
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mainameiz
@mainameiz
Full-stack web-developer
Очереди это, как уже сказал bmalets, что-то вроде списков задач. Они нужны в основном для управлением нагрузкой, параллельностью. По дефолту есть только очередь default.

Классический пример разделения очередей:
- mailer - очередь для рассылки почтовых сообщения пользователям
- default - для всего остального

Можно сделать так что для очереди mailer вы запускаете 10 процессов (не воркеров, а именно процессов ОС), а для default только 1. Тем самым вы делаете приоритетной очередь mailer.
Распределением нагрузки можно также управлять с помощью "весов" (параметр -q mailer,9 default,1 ). В данном случае из 10 задач 9 будут взяты из очереди mailer и только одна из очереди default.

Под воркерами могут подразумеваться два понятия:
- воркер как процесс ОС который берет задачи из очередей на выполнение
- воркер как класс руби, который выполняет какую-то бизнес-задачу

В основном конечно же под воркерами подразумевается второй вариант.

По вашим вопросам:
- как воркеры исполняются?
Процесс-обработчик берет задачу из redis и выполняет её. Тут важно понимать, что при аварийном завершении работы процесса вы можете потерять задачу (такие кейсы бывают очень критичными для бизнеса).

- какой обьём памяти для этого нужен?
Объем данных в redis'е можно посмотреть в админском интерфейсе.

- почему redis

Кто знает...

- как это работает с redis
???

- почему в perform_async нельзя передовать сами обьекты? а только id, strings, json ...?
Можно, но не нужно. Все что попадает в perform_async должно попадать в redis. А это накладные расходы на хранение, сериализацию/десериализацию.

- Как правильно вызывать и добавлять очереди.
Что вы имели ввиду под "вызывать очереди"? Очереди добавляются автоматически
Вообще формат хранения можно запросто посмотреть в самом редисе.
Ответ написан
Ваш ответ на вопрос

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

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