1

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

为了让脚本在运行时不会完全杀死网站,我有哪些选项?添加一个测功机我认为可以解决它,但非常昂贵,特别是因为当我运行脚本时它在外部并不真正需要。

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

编辑:我在这里不是很清楚。我的问题是尽可能少地影响网络服务器/数据库,而不是运行脚本(无论何时等)。我计划在夜间运行脚本以尽可能少地影响,但我仍然不希望网站在那一小时内完全关闭。

4

3 回答 3

2

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

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

也可以完全停止网站工作 - 如果您的工作最终锁定了应用程序的其余部分试图访问的行/表,那么您的网络测功机将被阻止,直到您的工作释放这些锁定。

如果您在遍历提要时逐一解析提要和更新的数据库行,那么您可能会没事:就锁定争用而言,大量的小写入/读取比大量写入/读取要好,我认为您不会' 将很难击中数据库,因为听起来您主要是从索引列一次加载一行,进行一些 ruby​​ 计算,然后更新单行。

如果您确实发现性能下降到无法接受的程度,并且如果读取了瓶颈,那么一种出路是拥有一个读取从属设备(也称为副本,或者在 heroku 中说一个追随者)。简而言之,这是一个单独的、只读的数据库服务器,用于跟踪主数据库服务器(因此它始终是最新的)。您对此服务器所做的任何事情都不会影响您的主数据库,因此您可以放心查询。

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

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

于 2012-04-29T08:56:16.297 回答
1

查看用于 rails的feedzirra插件。当您想要进行饲料处理时,它非常棒。

还检查宝石。安装它,并创建一个经常运行的模型方法来处理您的提要。

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

于 2012-04-28T20:46:11.597 回答
1

我推荐你 gem resqueresque-scheduler。我在生产中使用它们,开发和测试非常简单方便(参见resque_spec

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

什么时候也很棒。我提出了一个替代方案。这是你的选择

于 2012-04-28T23:06:58.517 回答