【问题标题】:Heroku Request Timeout (H12) with Big DataHeroku 请求超时 (H12) 与大数据
【发布时间】:2013-09-16 08:01:13
【问题描述】:

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

【问题讨论】:

  • 你能显示你的控制器代码吗
  • 我已经编辑了正文。

标签: ruby-on-rails heroku


【解决方案1】:

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

编辑:

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

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

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

【讨论】:

  • 对于管理员用户,上面的代码与此代码完全相同:@ca_responses = CaResponse.page(params[:page]).per(5) 我的问题是试图一次获取所有记录吗?
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 你说得很好。我在本地也试过了,没有问题。所以,我最好添加 new_relic 并分析请求。但我不确定 Unicorn,因为我认为我的应用程序有时会成为内存怪物。
  • 另外,关于本地运行:请注意heroku's timeout is 30 seconds。我不确定瘦和 webrick 有这样的强制限制时间。您的本地请求是否在这 30 秒内?
  • 我正在使用瘦,你是对的,没有。但我的本地请求大多不到 30 秒。我不确定我是否应该切换到独角兽。
  • 另外,你使用heroku免费计划吗?那些性能特别差,因此在本地开发环境中需要 20 秒的时间很容易在 heroku 免费计划中花费 30 秒,即使在 prod env 上也是如此。无论如何,如果一个请求在本地花费超过 10 秒,那就是个问题。哪些本地服务器日志告诉您视图/活动记录中经过的时间?
  • 不,我有付费计划。本地请求超过 10 秒是否意味着我的代码很差?在这种情况下,我会考虑重新考虑我的控制器的索引方法。 New relic 还说 Response#find 是请求的很大一部分。有很多记录,我必须以某种方式对它们进行分类。顺便说一句,本地控制台说:“Completed 200 OK in 1157ms (Views: 113.0ms | ActiveRecord: 1041.1ms)”这够好吗?
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2021-06-07
  • 2021-12-07
  • 2020-07-09
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多