Подтвердить что ты не робот

Sidekiq Rails 4.2 Используйте Active Job или Worker? Какая разница

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

Ниже приведена одна и та же отправка почтового кода с использованием задания активного задания и работника Sidekiq. Я использую When when gem для планирования.

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

Использование Sidekiq "Рабочий"
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

Использование активного задания "Работа"
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
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

|                   | 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      |

Ответ 3

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