【问题标题】:Whenever gem to trigger Rails' ActiveJob vs rake task to run regularly scheduled task | Rails 5每当 gem 触发 Rails 的 ActiveJob vs rake 任务运行定时任务 |导轨 5
【发布时间】:2020-06-02 04:57:29
【问题描述】:

我正在开发一个 Rails 5.2 项目,该项目需要计划的异步任务每晚运行。我一直在研究使用whenever gem 触发ActiveJob job 和使用when 触发老式rake 任务(/lib/tasks/some_task.rake) 之间的区别 - 我正在努力寻找很多值得注意的方式无论哪种方式的优点和/或缺点。以下面两个基本的示例实现为例,这两种策略有什么区别?

我可以看到的不同之处在于,使用 ActiveJob,您可以获得selecting a queue 的额外灵活性以运行作业,而triggering callbacks around the job,在 rake 任务中,您仅限于单线程,并且没有可用的回调。

还有其他值得关注的区别吗?

活动作业

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

【问题讨论】:

  • 您想判断解决问题的两种方法之间的权衡。这太棒了!但是,为了让其他人以有意义的方式帮助您解决此问题,您需要提供有关问题所在的丰富细节。你想达到什么目的?工作或任务将做什么?它的行为是什么?否则我只能笼统地说。在判断一个工具时,您需要知道您将使用该工具的目的。
  • @PatrickQuigley 感谢您的反馈 - 示例已扩展,以显示遍历记录范围、发送电子邮件和更新属性。
  • 根据您目前提供的内容添加了答案。它还会提示您提供更多信息。如果您确实提供了该信息,我可以更新答案,但是,它很有可能会为您提供足够的思考,让您进步朋友!让我知道你过得怎么样。
  • 我的回答对你有帮助吗@slehmann36?

标签: ruby-on-rails rake rake-task whenever rails-activejob


【解决方案1】:

峰值负载会是什么样子?

平均负载呢?

它需要有多可靠?

在判断走哪条路线时,此类信息至关重要。

根据目前提供的信息回答

您希望每天发送 X 封电子邮件,在您的系统可能处于低使用率期间。根据您迄今为止提供的内容,这看起来确实是一个简单的用例。

您建议的两种方法之间没有任何重大区别。 Rails 是关于约定优于配置。除非您有充分的理由不这样做,否则您应该使用 ActiveJob 框架。它用作作业基础架构的 API,让您可以在需求发生变化时轻松交换队列后端实现。

您没有提出任何表明打破惯例的要求在这里有用。保持简单并利用 Rails 如此出色的原因,它的约定为您做了很多工作。

Intro to ActiveJob, snippet below taken from it.

重点是确保所有 Rails 应用程序都具备适当的作业基础架构。然后,我们可以在此基础上构建框架功能和其他 gem,而不必担心各种作业运行器之间的 API 差异,例如 Delayed Job 和 Resque。那么,选择你的队列后端就变成了一个操作问题。而且您可以在它们之间切换,而无需重写您的工作。

您应该使用哪个队列后端?从sidekiq 开始,然后从那里开始。迭代构建。如果您达到了 sidekiq 限制您的阶段,ActiveJob 可以轻松地将其切换到另一个队列工具。好时光!

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2017-04-26
    • 1970-01-01
    • 2013-01-12
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2011-06-04
    相关资源
    最近更新 更多