6

我有一个应用程序,它每分钟检查一次数据库,以查找当时应该发送的任何电子邮件。我正在考虑将其设为每分钟由 cron 作业运行的 rake 任务。会有更好的解决方案吗?

根据我的阅读,这并不理想,因为 rake 必须每分钟加载整个 rails 环境,这变得很昂贵。

想法?

谢谢。

4

4 回答 4

11
  1. 您可以使用backgroundrb. 然而,这会消耗掉你的 Rails 主应用程序的内存,因为它会生成一个backgroundrb.
  2. 您还可以SystemController在您的主应用程序中定义一个(或等效的),其中各种操作对应于您的应用程序应执行的各种家庭任务。crontab您可以使用wgetor来“刺激”它curl,其优点是它与您的主应用程序共享资源。根据您或您的偏执程度,或者根据 DOS(或其他类型的攻击)将此类控制器暴露给外部世界的脆弱性,您可以选择阻止从环回以外的地址访问此控制器的 URL (理想情况下在您的反向代理中,或者来自控制器本身。)
于 2009-03-18T00:38:49.270 回答
1

一种非常简单的方法是有一个脚本来做..

while true do
    check_and_send_messages()
    sleep 60
end

..这意味着您不会不断地重生 Rails 环境。

显然它有各种缺陷,但也有一些好处(例如,对于你的 1-Rake-per-minute,如果 Rake 任务需要超过一分钟,Rake 将一次运行多次)

此外,Railscasts 剧集Rake in BackgroundStarling 和 Workling以及Custom Daemon可能会给你一些想法(他们正在描述这个任务)

于 2009-03-21T04:34:49.077 回答
1

事实证明,实际上有一些东西就是为此而构建的:ar_mailer。ar_mailer 将电子邮件排队到数据库中,然后使用 ar_mailer 命令定期将它们发送出去。您可以每分钟调用一次 ar_mailer。

ar_mailer 的好处在于,它基本上只需要很少改变您已经发送电子邮件的方式。你只需要继承 ar_mailer 而不是 ActiveMailer。使用这种方法,您不必担心在后台运行 rake 任务、分叉进程或类似的事情 - 实际上,您会获得一个真正的邮件服务器,其中包含在实际发送邮件时会删除的排队消息。如果您有一个发送大量电子邮件的系统,则此功能很重要。我已经使用 ar_mailer 建立了一个社交网络——所以我可以证明它的稳健性。

这是一篇深入讨论 ar_mailer 的好文章。我强烈建议不要在这里推出你自己的解决方案,因为 Eric 已经为这个问题建立了一个经过时间考验的解决方案。

于 2009-03-21T04:44:13.750 回答
0

我按照 Vlad 的建议 (#2),只尊重本地请求,而且我很偏执,还需要在 url 上附加一个特定的查询字符串。

我以这种方式设置了几个定期操作。

于 2009-03-21T03:15:54.163 回答