【发布时间】:2010-10-13 23:33:48
【问题描述】:
我有一个应用程序,它每分钟检查一次数据库中是否有任何应该在那个时候发出的电子邮件。我正在考虑将其设为每分钟由 cron 作业运行的 rake 任务。会有更好的解决方案吗?
根据我的阅读,这并不理想,因为 rake 必须每分钟加载整个 rails 环境,这会变得很昂贵。
想法?
谢谢。
【问题讨论】:
标签: ruby-on-rails cron rake backgroundrb
我有一个应用程序,它每分钟检查一次数据库中是否有任何应该在那个时候发出的电子邮件。我正在考虑将其设为每分钟由 cron 作业运行的 rake 任务。会有更好的解决方案吗?
根据我的阅读,这并不理想,因为 rake 必须每分钟加载整个 rails 环境,这会变得很昂贵。
想法?
谢谢。
【问题讨论】:
标签: ruby-on-rails cron rake backgroundrb
backgroundrb。但是,这会占用您的 Rails 主应用程序的内存,因为它会生成一个 backgroundrb 独有的 Ruby 实例。SystemController(或等效项),并使用与您的应用程序应执行的各种家庭任务相对应的各种操作。您可以使用wget 或curl 从crontab“刺激”它,优点是它与您的主应用程序共享资源。根据您或您的偏执程度,或者根据 DOS(或其他类型的攻击)将此类控制器暴露给外部世界的脆弱性,您可以选择阻止从环回以外的地址访问此控制器的 URL (理想情况下,在您的反向代理中,或者来自控制器本身。)【讨论】:
一个非常简单的方法是有一个脚本来做......
while true do
check_and_send_messages()
sleep 60
end
..这意味着您不会不断地重生 Rails 环境。
显然它有各种缺陷,但也有一些好处(例如,对于您的 1-Rake-per-minute,如果 Rake 任务需要超过一分钟,Rake 将同时运行多次)
此外,Railscasts 剧集 Rake in Background、Starling and Workling 和 Custom Daemon 可能会给你一些想法(他们正在描述这项任务)
【讨论】:
事实证明,实际上有一个专门为此而构建的东西:ar_mailer。 ar_mailer 将电子邮件排队到数据库中,然后使用 ar_mailer 命令定期将它们发送出去。您可以每分钟调用一次 ar_mailer。
关于 ar_mailer 的好处在于,它基本上只需要很少改变您已经发送电子邮件的方式。你只需要继承 ar_mailer 而不是 ActiveMailer。使用这种方法,您不必担心在后台运行 rake 任务、分叉进程或类似的事情 - 实际上,您会获得一个真正的邮件服务器,其中包含在实际发送邮件时会删除的排队消息。如果您有一个发送大量电子邮件的系统,则此功能很重要。我使用 ar_mailer 构建了一个社交网络 - 因此我可以证明它的稳健性。
Here's a good article that talks about ar_mailer in depth。我强烈建议不要在这里推出您自己的解决方案,因为 Eric 已经为这个问题构建了一个经过时间考验的解决方案。
【讨论】:
我按照 Vlad 的建议 (#2) 做,只接受本地请求,而且我很偏执,还需要在 url 上附加一个特定的查询字符串。
我有几个以这种方式设置的周期性操作。
【讨论】: