Heroku请求超时(H12)与大数据

时间:2013-09-16 08:01:14

标签: ruby-on-rails heroku

我有一个Ruby on Rails应用程序,它可以从Twitter,Facebook等社交媒体网站获取大量数据。

有一个索引页面将记录显示为分页。我正在使用Kaminari进行分页。

我的问题是我的问题是大数据。让我们说我有数百万条记录,并希望在我的索引页面上显示它们与Kaminari。当我尝试通过浏览器运行系统时,Heroku给了我H12错误(请求超时)。

我可以做些什么来改善我的应用程序的性能?我有这个想法只获取将在索引页面上显示的记录。同样,当点击Kaminari第二页链接时,只从数据库中获取第二页记录。理念基本上就是那个,但我不知道从哪里开始以及如何实现它。

这是我控制器的一段代码示例:

@ca_responses = @ca_responses_for_adaptors.where(:ca_request_id => @conditions)
                                                 .order(sort_column + " " + sort_direction)
                                                 .page(params[:page]).per(5)

@ca_responses:我的记录

@ca_responses_for_adaptor:基于适配器的记录。以管理员身份思考,这将返回所有记录。

@conditions:获取指定的适配器记录。例如,只获取Twitter相关记录等。

2 个答案:

答案 0 :(得分:0)

您可以首先创建一个页面缓存表,该表格将填入搜索结果的数据。这可能是一种方法。 可能会有一些缺点,但如果我知道确切的问题,那么我可以提出更好的解决方案。我怀疑你会在一个页面上列出百万用户,然后通过对页面进行分页来访问它们(?)或者我错了

编辑:

分页可能没什么问题。首先,分页宝石的工作方式如下:它们获取所有数据,然后当您单击页码时,它只从整个列表中获取第二个5个元素(或者您已设置它)。这里的问题是fetching all the data before paginating。如果您有一百万条记录,那么每个页面可能需要一段时间。您可以定义将运行SQL查询以从数据库中选择一个数据量的新方法,并且可以设置offset指令以仅为该页面获取数据。在这种情况下,paginate gem是无用的,因此您需要将其删除。

第二个选项是你可以使用像user_cashe这样的东西。我的意思是创建一个只有几条记录的新表 - 将在屏幕上显示的记录。该表将小于usuall用户表,然后,搜索它会更快。

可能还有其他更高级的解决方案,但我怀疑你可以(希望)在你的应用程序中使用它。

答案 1 :(得分:0)

Kaminari已按预期对您的记录进行分页。

由于random router,Heroku容易出现随机超时错误。

尝试在本地重现。您的代码可能存在瓶颈,这确实导致您的请求太长而无法返回。从数据库中请求5个项目时不应该有任何问题,因此您可能需要在之前或之后使用需要很长时间才能运行的代码。

如果本地生产数据一切正常,您可以添加new_relic来分析您的请求,看看是否有一些问题专门针对生产(及其原因)。

如果看起来heroku路由器确实存在问题,你仍然可以尝试使用独角兽作为网络服务器,但你必须特别注意你的应用不会消耗太多内存(每个独角兽工作者都会消耗掉一个内存整个应用程序,你可以达到heroku内存限制,这将产生R14错误代替那些H12)。