请求外部服务(S3)花费太多时间

时间:2017-08-31 08:27:21

标签: ruby-on-rails amazon-s3 newrelic

我现在已经奋斗了2天了,我无法想象我应该做些什么。我正在使用Rails(4.2.3)和Ruby 2.2.1,如果这有任何帮助。

在安装新的遗物宝石后,我发现我的两个控制器需要花费大量时间来响应(约17秒)的原因是由于对亚马逊s3的请求。

这些页面只使用ransack gem显示10条记录。

以下是您可以看到的屏幕截图。

非常感谢任何帮助......

New Relic external services screenshot

2 个答案:

答案 0 :(得分:0)

像S3这样的外部服务调用可能需要时间,具体取决于多个变量,如:

  1. 网络路由选择您的服务器到S3。查看traceroute
  2. 延迟使用服务器。较高ping会导致建立连接的时间更长。
  3. AWS S3端的运行状况 - 如果他们的服务遇到问题,您的服务可能会受到影响
  4. 等..
  5. 通常建议在后台执行图像/文件调整大小/上传等任务。像ResqueSidekiq这样的宝石可以用来做到这一点。

答案 1 :(得分:0)

很难准确地说,每条记录的10条记录1.7秒似乎相当大,也许你应该在Rails之外测量(例如在浏览器中直接请求相同的URL)。

但通常在控制器中发出10个连续请求是件坏事。即使请求相当快,制作其中10个也可能是该响应中最慢的一倍。

  1. 您可以通过每次产生10个线程来获取记录,然后加入并渲染视图来实现此目的。
  2. 或者您可以异步获取每条记录(非阻塞,因此所有10条记录都会同时发生)。
  3. 或者,如果您可以在页面中使用AJAX / XHR响应呈现数据,请使constroller仅获取1项并单独进行应用程序请求(但是您会将浏览器最大请求命中为域限制因此不会得到全速10倍加速)。
  4. 如果浏览器不需要立即响应,请使用后台任务运行器(许多Gems)并告诉浏览器“其挂起”。这将避免占用您的Rails服务器,但从单个用户的角度来看,甚至可能更慢
  5. 不幸的是Ruby / Rails中的异步支持并不是很好(猜测需要更多人要求和贡献)。我不认为使用AWS开发工具包可以使用选项2,你需要四处寻找一个非常低级的HTTP客户端库(而不仅仅是一个线程/光纤包装器)。