我正在开发一个Rails网站,每天必须运行一次脚本。该脚本读取xml-feeds并更新数据库。我正在使用Rails 3.1.1并在Heroku上运行网站。
我在这里有什么选项可以让脚本在运行时不会完全杀死网站?添加一个dyno我认为可以解决它但是相当昂贵,特别是因为我在运行脚本时并不需要它。
我可以在另一个数据库上运行该脚本并复制它吗?在后台运行它?简而言之,我有哪些选择?
编辑:我在这里不太清楚。我的问题是尽可能少地影响webserver /数据库,而不是运行脚本(只要等等)。我计划在晚上运行脚本以尽可能少地影响,但我仍然不希望网站在那个小时内彻底失效。答案 0 :(得分:2)
这很大程度上取决于脚本的性能特征。如果是非常cpu密集但影响很小,那么我不担心:当使用类似heroku调度程序的东西时,作业在单独的dyno中运行。由于它是一个单独的dyno,它不会影响你正在服务请求的其他dynos。
繁重的数据库使用是另一回事。你的数据库有一定数量的IO,缓存,CPU等等。如果你正在努力推动它(大量的写入通常比大量的读取更糟糕,因为那些胸围缓存)那么你可以降低你的其他dynos的性能。 / p>
也可以阻止网站工作 - 如果你的工作最终锁定应用程序其余部分试图访问的行/表,那么你的网络动态将被阻止,直到你的工作发布这些锁
如果你正在解析一个feed,当你遍历feed时逐个更新db行,你可能会没问题:在锁争用方面,很多小的写/读比大块的更好,我不喜欢我认为你会很难击中数据库,因为它听起来你主要是从索引列一次加载一行,进行一些红宝石计算,然后更新一行。
如果你确实发现性能下降得令人无法接受,并且如果瓶颈是读取的,那么一个出路就是有一个读取从属(也称为副本,或者在heroku中说follower)。简而言之,这是一个独立的只读数据库服务器,它跟踪主数据库服务器(所以它总是非常新的)。您对此服务器所做的任何操作都不会影响您的主数据库,因此您可以无需担心地查询。
如果问题是您需要执行的写入次数,这对您没有帮助。在某种程度上,这可以通过切换到更强大的数据库服务器来解决(需要付出代价)。对于某些使用模式,不同类型的数据存储(例如,mongo,redis)有时比关系数据库更合适。有时可以构建一些性能热点,但显然你是最适合考虑它的人。
这一切都非常抽象 - 你真正知道的唯一方法就是尝试。设置应用程序的副本,启动此任务并查看性能如何降低(如果您不担心一次性影响,则针对真实应用程序执行此操作)
答案 1 :(得分:1)
查看有关rails的feedzirra插件。当你想进行饲料加工时非常棒。
同时结帐whenever宝石。安装它,并创建一个模型方法,该方法经常运行以进行Feed处理。
这样,您的Web服务器完全脱离了循环,这不会影响服务请求。然而,数据库是一个不同的故事。
答案 2 :(得分:1)
我建议你使用宝石resque和resque-scheduler。我在生产中使用它们,开发和测试非常简单方便(参见resque_spec)
我知道heroku非常支持redis。你可以尝试gem heroku-scheduler。我没有使用它,但认为它也很酷;)
Whenever也很棒。我提出了另一种选择。这是你的选择