每分钟运行一次的邮件的最佳导轨解决方案

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

从我所读到的,这不是理想的,因为rake必须每分钟加载整个rails环境,这变得昂贵。

思考?

谢谢。

  1. 你可以使用backgroundrb 。 但是,这将占用远离主Rails应用程序的内存,因为它将生成一个独立于backgroundrb Ruby实例。
  2. 您还可以在主应用程序中定义SystemController (或等效项),其中包含与应用程序应执行的各种家庭任务相对应的各种操作。 您可以使用wgetcurlcrontab “生成”它,其优点是它与您的主应用程序共享资源。 根据您的偏执程度,或者对可能是外部世界的DOS(或其他类型的攻击)暴露此类控制器的容易程度,您可以选择阻止从环回以外的地址访问此控制器的URL(理想情况下,在您的反向代理中,或者从控制器本身。)

一个非常简单的方法是使用一个脚本来做..

 while true do check_and_send_messages() sleep 60 end 

..这意味着你不会经常重生Rails环境。

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

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

事实certificate,实际上是为此构建了一些东西:ar_mailer。 ar_mailer将电子邮件排队到数据库中,然后使用ar_mailer命令定期发送它们。 你可以每分钟调用ar_mailer。

关于ar_mailer的好处是它在你已经发送电子邮件的方式上基本上只需要很少的改变。 您只需要从ar_mailer而不是ActiveMailerinheritance。 使用此方法,您不必担心在后台运行rake任务,分叉进程或类似的任何事情 – 实际上,您将获得一个真实的邮件服务器,其中包含在实际发送邮件时删除的排队邮件。 如果您的系统发送大量电子邮件enmass,则此function非常重要。 我已经使用ar_mailer构建了一个社交网络 – 所以我可以certificate它的健壮性。

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

我做的是弗拉德建议的(#2),只有本地请求被尊重,而且我很偏执,也需要在url上添加特定的查询字符串。

我通过这种方式设置了几个定期动作。

Interesting Posts