ruby-on-rails - Rails 3.1/rake - 没有队列的特定于日期的任务

标签 ruby-on-rails ruby ruby-on-rails-3 rake scheduled-tasks

我想让我的用户可以选择在特定的(用户给定的)时间向他们发送帐户统计信息的每日摘要....

让我们说下面的模型:

class DailySummery << ActiveRecord::Base
  # attributes:
  # send_at
  # => 10:00 (hour)
  # last_sent_at
  # => Time of the last sent summary
end

现在是否有最佳实践如何通过电子邮件将此帐户摘要发送到特定时间?

目前我有一个无限的 rake 任务正在运行,它会永久检查电子邮件是否可用于发送,我想将 dailysummary-generation 和 send 放入这个 rake 任务中。

我想我可以用下面的伪代码来解决这个问题:

while true
  User.all.each do |u|
    u.generate_and_deliver_dailysummery if u.last_sent_at < Time.now - 24.hours
  end
  sleep 60
end

但我不确定这是否有一些隐藏的警告...

注意:我不想使用像 resq 或 redis 之类的队列!

编辑:添加 sleep (已在我的脚本中)

编辑:这是一项时间紧迫的服务(交易率通知),因此它应该尽可能快。这就是为什么我不想使用队列或基于作业的系统的背景。我使用 Monit 来管理这个 rake 任务,它工作得很好。

最佳答案

只有两种主要方式可以延迟执行。当您网站上的用户点击页面时,您运行脚本,这是低效且不完全准确的。或者使用某种后台进程,无论是 cron 作业还是 resque/delayed 作业等。

虽然您让 rake 进程永远运行的方法可以正常工作,但效率很低,因为您在它完成后立即对用户进行 24/7 迭代,例如:

while true
    User.where("last_sent_at <= ? OR last_sent_at = ?", 24.hours.ago, nil).each do |u|
            u.generate_and_deliver_dailysummery
    end

    sleep 3600
end

每小时运行一次并且只拉取需要发送电子邮件的用户效率更高一些。最佳实践是使用 cronjob 来运行你的 rake 任务。

关于ruby-on-rails - Rails 3.1/rake - 没有队列的特定于日期的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705526/

相关文章:

ruby-on-rails - 用于 ruby​​ on rails 的 CKFinder gem

mysql - 试图在 MySQL 数据库中设置日期时间字段的 Ruby 错误

java - 解码 MIME(HTML+附件)

ruby-on-rails - 使用一些参数运行 rails runner

ruby-on-rails - Rails Accepts_nested_attributes_for 错误,请帮我找出来

ruby - 可以区分 ruby​​ 中的简单运算符和复合赋值运算符之间的歧义吗?

ruby-on-rails-3 - Rails 3 - 登录另一个站点并在 session 中保留 cookie

ruby-on-rails - 使用 Redis 的 Rails 页面缓存?

ruby-on-rails-3 - ThinkingSphinx 在 Cucumber 中处于测试模式时不返回结果

mysql - 通过 has_one/belongs_to 将模型 id 保存为外键