我正在一个Rails 5.2项目上工作,该项目需要计划的异步任务才能每晚运行。我一直在研究使用whenever gem触发ActiveJob job与使用任何时候触发旧式rake任务(/lib/tasks/some_task.rake
)之间的区别-我正在努力寻找很多值得注意的方法优点和/或缺点。以下面的两个基本示例实现为例,两种策略之间有什么区别?
我可以看到的差异是,通过ActiveJob,您可以在要运行的作业中获得selecting a queue的更多灵活性,而在执行rake任务时,triggering callbacks around the job则限于单线程,并且没有回调可用。
还有其他值得一看的区别吗?
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
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
峰值负载会是什么样?
平均负载如何?
它需要多可靠?
这样的信息在判断下降的路线时必不可少。
根据到目前为止提供的信息进行回答
您想在系统可能处于低使用率期间每天发送X封电子邮件。根据您到目前为止提供的内容,这看起来确实是一个简单的用例。
您建议的两种方法之间没有太大区别。 Rails的全部内容是[[配置时的常规约定。除非您有很好的理由不这样做,否则应使用ActiveJob框架。它用作作业基础结构的API,使您可以在需求发生变化时轻松地交换排队的后端实现。
您没有建议任何表明违反常规的要求在这里有用。保持简单并利用使Rails如此出色的优势,惯例是为您完成了很多工作。您应该使用哪个队列后端?从sidekiq开始简单,然后从那里开始。迭代构建。如果您到达了sidekiq限制您的阶段,ActiveJob便可以轻松地将其切换为另一个队列工具。好时光!