2011-08-12 66 views
0

我是一位在Web应用程序上工作的新Rails程序员。作为此Web应用程序的一部分,我正在使用其他网站的Web服务生成的大量JSON页面。根据用户的新请求,我可能需要轮询3-5个Web服务。缓存Web服务结果并过期

为了帮助重复常见请求的速度,我试图做一个本地缓存服务的结果。对于每个服务,如果他们有任何匹配的结果,我解析它们的格式,并将行插入到我的本地表中,以及'pull'id(它有我从中取出的源和日期)。

我的问题是:这似乎是一个很常见的事情。我使用单个数据源工作正常,但需要扩展,所以在我编写一些辅助方法以帮助简化我的生活之前,我很好奇,如果有更好的方法在Rails框架中使用gem或其他插件...

+1

如果你想自动过期,你应该看看memcached或类似的东西。您将获取结果并将其存储在memcached中,并显示过期时间。每次需要结果时,请检查memcached,如果没有,则从服务中取回并再次缓存。 – rubish

+0

谢谢,这有助于考虑! – tkrajcar

回答

1

这种行为最好在后台完成。

这样做更传统,但仍然令人敬畏的Ruby方式是在你的数据库中创建一堆数据源并创建一个使用你想要的任何技术的耙子任务(使用一个像机械化或nokogiri,写出一个模型,在你的app/lib文件夹中添加一些有用的Ruby类,放入一个插件或某个供应商的东西,,无论)。然后你可以通过传统的cron作业来调用这个rake任务,或者像clockwork(本质上是一个反复任务管理器的红宝石版本)。

这样做的更多新方法是放下类似DelayedJob来处理单个数据源的更新。当您为给定源成功获取数据时,只要您关心即可设置过期时间,并且您的应用程序在下一次抓取该缓存数据时,可以在队列中为其中一位工作人员创建另一个作业,以便更新该数据资源。一旦这项工作完成,对这些数据的请求就可以转到最新的信息。这样可以避免像5分钟长的rake任务那样在早期源中失效并且永远不会更新任何数据,或者因为互联网掉落12秒而导致错过了6小时轮询时间间隔,因此您的数据全部丢失以小时和小时陈旧。

有很多工具可以使用,而且我知道你在询问具体细节,但我希望关于方法论/体系结构的更多一般信息可以让你了解你能做什么。

+0

谢谢,这给了我很多研究! – tkrajcar