Всякий раз, когда gem запускает задачу ActiveJob против rake в Rails для запуска запланированной задачи Рельсы 5 - PullRequest
0 голосов
/ 18 февраля 2020

Я работаю над проектом Rails 5.2, который требует выполнения запланированной асинхронной задачи для ночного запуска. Я смотрел на различия между использованием всякий раз, когда gem для запуска задания ActiveJob , и использованием всякий раз, когда запускается задача грабли старого стиля (/lib/tasks/some_task.rake) - I ' Я изо всех сил пытаюсь найти много на пути заметных плюсов и / или минусов в любом случае. Если взять две реализации базового c примера ниже, каковы различия между двумя стратегиями?

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

Есть ли другие различия, на которые стоит обратить внимание?

ActiveJob

app/jobs/subscription_reminder_job.rb:

class SubscriptionReminderJob < ApplicationJob
  queue_as :default

  def perform
    Subscription.overdue.find_each do |overdue_subscription|
      UserMailer.subscription_reminder(overdue_subscription.user, overdue_subscription).deliver_later

      overdue_subscription.touch(:last_subscription_reminder_sent_at)
    end
  end
end

config/schedule.rb:

every :day, at: '12:00am' do
  runner "SubscriptionReminderJob.perform"
end

Задача Rails

lib/tasks/send_subscription_reminders.rake:

task send_subscription_reminders: :environment do
  Subscription.overdue.find_each do |overdue_subscription|
    UserMailer.subscription_reminder(overdue_subscription.user, overdue_subscription).deliver_later

    overdue_subscription.touch(:last_subscription_reminder_sent_at)
  end
end

config/schedule.rb:

every :day, at: '12:00am' do
  rake "send_subscription_reminders"
end

1 Ответ

0 голосов
/ 20 февраля 2020

Как будет выглядеть пиковая нагрузка?

А как насчет средней нагрузки?

Насколько надежным он должен быть?

Подобная информация необходима для определения маршрута к go.

Ответы на основе информации, предоставленной на данный момент

Вы ' Вы хотите отправлять X электронных писем ежедневно, во время предположительно низких периодов использования вашей системы. Исходя из того, что вы уже предоставили, это действительно простой случай использования.

Между этими двумя подходами нет существенного различия. Rails - это соглашение о конфигурации . Если у вас нет веских причин для этого, вы должны использовать фреймворк ActiveJob. Он служит в качестве API для инфраструктуры заданий, позволяя вам легко менять внутреннюю реализацию очереди при изменении требований.

Вы не предлагали никаких требований, которые указывали бы на нарушение соглашения, которые будут здесь полезны. Будьте просты и используйте то, что делает Rails таким хорошим, его соглашения делают большую работу за вас.

Введение в ActiveJob, фрагмент кода взят из него.

Суть в том, чтобы все приложения Rails имели инфраструктуру заданий. После этого мы можем создать фреймворк и другие гемы, не беспокоясь о различиях API между различными исполнителями заданий, такими как отложенное задание и Resque. Выбор вашего бэкэнда в очереди становится более оперативным. И вы сможете переключаться между ними, не переписывая свои задания.

Какой сервер очереди следует использовать? Начните просто с sidekiq и go оттуда. Построить итеративно. Если вы достигли стадии, когда sidekiq ограничивает вас, ActiveJob упрощает переключение на другой инструмент очереди. Хорошие времена!

...