1

我有一个 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 相关记录等。

4

2 回答 2

0

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

编辑:

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

第二个选项是您可以使用类似 user_cshe 的东西,类似的东西。我的意思是创建一个只有几条记录的新表——这些记录将显示在屏幕上。该表将比通常的用户表小,然后通过它进行搜索会更快。

可能还有其他更高级的解决方案,但我怀疑您是否可以(想要)在您的应用程序中使用它。

于 2013-09-16T08:25:45.803 回答
0

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

Heroku 由于其随机路由器而容易出现随机超时错误。

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

如果在本地使用生产数据一切正常,您可以添加 new_relic 来分析您的请求,并查看是否在生产中特别出现了某些问题(以及原因)。

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

于 2013-09-16T08:29:19.053 回答