Rails:每天运行一个feedreading脚本(1h)。 建议?

我正在开发一个Rails网站,每天必须运行一次脚本。 该脚本读取xml-feeds并更新数据库。 我正在使用Rails 3.1.1并在Heroku上运行该网站。

我有什么选项,以便脚本在运行时不会完全杀死网站? 添加一个dyno我认为可以解决它但是非常昂贵,特别是因为我在运行脚本时并不需要外部。

我可以在另一个数据库上运行该脚本并复制它吗? 在后台运行它? 简而言之,我有什么选择?

编辑:我在这里不太清楚。 我的问题是尽可能少地影响webserver /数据库,而不是运行脚本(只要等等)。 我计划在晚上运行脚本以尽可能少地影响,但我仍然不希望网站在那个小时内彻底失效。

这很大程度上取决于脚本的性能特征。 如果非常cpu密集但影响很小,那么我不担心:当使用类似heroku调度程序的东西时,作业在一个单独的dyno中运行。 由于它是一个单独的dyno,它不会影响你正在服务请求的其他dynos。

繁重的数据库使用是另一回事。 您的数据库具有有限数量的IO,缓存,CPU等等。如果您正在努力推动它(其中大量写入通常比大量读取更糟糕,因为那些胸围缓存)那么您可以降低其他dynos的性能。

也可以阻止网站工作 – 如果你的工作最终取消了应用程序其余部分试图访问的行/表,那么你的网络动态将被阻止,直到你的作业释放这些锁。

如果你在遍历feed时解析一个feed一个更新的db行,你可能会没问题:在锁争用方面,很多小写/读取比大规模要好,我不认为你因为听起来你主要是从索引列一次加载一行,进行一些ruby计算然后更新一行,所以会很难击中数据库。

如果你确实发现性能降低得令人无法接受,并且如果瓶颈是读取,那么一个出路就是有一个读取从属(也称为副本,或者在heroku中说跟随者 )。 简而言之,这是一个独立的只读数据库服务器,它跟踪主数据库服务器(所以它总是非常新的)。 您对此服务器所做的任何操作都不会影响您的主数据库,因此您可以无需担心地查询。

如果问题是您需要执行的写入次数,这对您没有帮助。 在某种程度上,这可以通过切换到更强大的数据库服务器来解决(需要付出代价)。 对于某些使用模式,不同类型的数据存储(例如mongo,redis)有时比关系数据库更合适。 有时可以构建一些性能热点,但显然你是最适合考虑它的人。

这一切都非常抽象 – 你真正知道的唯一方法就是尝试。 设置应用程序的副本,启动此任务并查看性能如何降低(如果您不担心一次性影响,则针对真实应用程序执行此操作)

查看rails的feedzirra插件。 想要进行饲料加工时效果非常好。

每当gem都结账。 安装它,并创建一个模型方法,每隔一段时间运行一次,以进行Feed处理。

这样,您的Web服务器就完全脱离了循环,这不会影响服务请求。 然而,数据库是一个不同的故事。

我建议你使用gems resque和resque-scheduler 。 我在生产中使用它们,开发和测试非常简单方便(参见resque_spec )

我知道heroku非常支持redis。 你可以试试gem heroku-scheduler 。 我没有使用它,但认为它也很酷;)

无论什么时候都很棒。 我提出了另一种选择。 这是你的选择