Sidekiq Rails 4.2 Использовать активную работу или работника? Какая разница

Это моя первая асинхронная обработка заданий. Я использую Sidekiq для фоновой обработки в своем приложении. Я буду использовать его для писем с напоминаниями и уведомлений в приложении. Я не понимаю, следует ли мне использовать Active Job для создания задания, которое отправляет электронное письмо, или Sidekiq Worker для отправки электронного письма. Кажется, что они делают то же самое, и Rails 4.2 Active Job кажется очень новым… заменяет ли он необходимость в Sidekiq Worker?

Ниже показано то же самое, что и отправка кода почтовой программы с использованием задания Active Job и Sidekiq Worker. Для планирования я использую гем "Всякий раз".

my_mailers.rb

class MyMailers < ActionMailer::Base

  def some_mailer(r.user_id)
    @user = User.find(r.user_id)
    mailer_name = "ROUNDUP"
    @email = @user.email
    @subject ="subject text"
    mail(to: @email, 
      subject: @subject,  
      template_path: '/notifer_mailers', 
      template_name: 'hourly_roundup.html',
      )
  end
end

Использование Sidekiq "Worker"
some_worker.rb

class SomeWorker
  include Sidekiq::Worker

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r|
      MyMailers.some_mailer(r.user_id).deliver_later
    end
  end

end

Использование активного задания "Job"
some_job.rb

class SomeJob < ActiveJob::Base
  queue_as :mailer

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r|
      MyMailers.some_mailer(r.user_id).deliver_later
    end
  end

end

Оба примера в моем планировщике "Когда угодно" schedule.rb

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
set :path, Rails.root
set :output, Rails.root.join('log', 'cron.log')

#using a worker
every 1.day, :at => '4:30 am' do
  runner SomeWorker.perform_async
end

#using a job
every 1.day, :at => '4:30 am' do
  runner SomeJob.perform_async
end

person NothingToSeeHere    schedule 28.04.2015    source источник


Ответы (4)


Короткий ответ: это одно и то же. ActiveJob называет это Job, а Sidekiq называет Worker. Я решил сохранить терминологию по-разному, чтобы люди могли различать их.

Вы можете использовать любой из них. Обратите внимание, что ActiveJob не предоставляет доступ к полному набору параметров Sidekiq, поэтому, если вы хотите настроить параметры для своей работы, вам может потребоваться сделать его рабочим.

person Mike Perham    schedule 28.04.2015
comment
спасибо за ответ и отличную работу! один очень связанный вопрос: можно ли по-прежнему использовать старый синтаксис sidekiq в почтовых программах? например UserMailer.delay.welcome_email (@ user.id) - person superuseroi; 24.05.2015
comment
Абсолютно. Все старые API-интерфейсы по-прежнему работают и их можно использовать. - person Mike Perham; 25.05.2015
comment
Отлично, это отличный способ позволить sidekiq предоставить свои потрясающие функции повтора :) Это полезно знать ❤ - person superuseroi; 25.05.2015
comment
К счастью, начиная с версии 6.0 sidekiq, sidekiq_options также можно передавать через ActiveJob :) github.com/mperham/sidekiq/blob/master/6.0-Upgrade.md#whats-new - person loybert; 06.09.2019

В Rails 4.2 добавлено ActiveJob для унификации API заданий, но для его асинхронного запуска вам понадобится фоновый обработчик, отсюда и происходит sidekiq.

Sidekiq уже имеет свой рабочий класс, но также реализовал новый активный класс заданий, поэтому он может работать в любом случае.

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

Здесь есть руководство по api rails, которое содержит хорошее сравнение обработчиков, поддерживающих активные задание, включая поддерживаемые функции каждого обработчика. Вот сравнительная таблица, если вам лень проверять ссылку:

|                   | Async | Queues | Delayed   | Priorities | Timeout | Retries |
|-------------------|-------|--------|-----------|------------|---------|---------|
| Backburner        | Yes   | Yes    | Yes       | Yes        | Job     | Global  |
| Delayed Job       | Yes   | Yes    | Yes       | Job        | Global  | Global  |
| Qu                | Yes   | Yes    | No        | No         | No      | Global  |
| Que               | Yes   | Yes    | Yes       | Job        | No      | Job     |
| queue_classic     | Yes   | Yes    | No*       | No         | No      | No      |
| Resque            | Yes   | Yes    | Yes (Gem) | Queue      | Global  | Yes     |
| Sidekiq           | Yes   | Yes    | Yes       | Queue      | No      | Job     |
| Sneakers          | Yes   | Yes    | No        | Queue      | Queue   | No      |
| Sucker Punch      | Yes   | Yes    | No        | No         | No      | No      |
| Active Job Inline | No    | Yes    | N/A       | N/A        | N/A     | N/A     |
| Active Job        | Yes   | Yes    | Yes       | No         | No      | No      |
person Mohammad AbuShady    schedule 28.04.2015
comment
похоже, что даже если вы используете activejob и устанавливаете его с помощью sidekiq, он подпадает под возможности sidekiq, верно? (потому что мои повторные попытки в настоящий момент все еще выполняются) - person dtc; 28.08.2015

Я бы порекомендовал использовать собственный sidekiq для получения дополнительных функций. Я также время от времени сталкивался с некоторыми странными проблемами сериализации с ActiveJob. ActiveJob, преследуя благородную цель внедрения унифицированного API, ограничивает многие реализации именно по этой причине и предлагает небольшую выгоду на данный момент IMO. Лично я более чем готов заплатить возможную цену за переписывание кода когда-нибудь в будущем (чего может и не случиться, ведь вы не меняете критически важные части приложения просто для развлечения - например, activerecord vs mongodb), если я решу поменять реализацию на более богатый набор функций.

person Dr.Strangelove    schedule 08.01.2016

Согласно документации, использование Sidekiq :: Worker может иметь преимущество в производительности по сравнению с ActiveJob.

https://github.com/mperham/sidekiq/wiki/Active-Job#performance

person Chad M    schedule 13.03.2019