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