1

我有一个 Rails 控制器方法,它只在同一服务器上打开一个文件:

open 'http://lvh.me:3000/feeds/madonna.rss'

大约 60% 的时间,当我启动服务器并点击此控制器方法时,“打开”调用超时:

Net::ReadTimeout: Net::ReadTimeout

其余时间打开就好了。

似乎如果第一个请求在启动服务器后有效,它将继续处理后续请求。如果第一个请求失败,它将继续失败。

只有当要打开的文件位于发出请求的同一台服务器上时,才会出现故障。换句话说,当我更改 URL 以调用同一端点但在登台服务器上时,它似乎每次都有效。

open-uri 和 FeedJira 的行为完全相同。

服务器尝试向同一台服务器发出请求时会出现一些阻塞问题吗?任何想法如何解决这个问题或进一步调试它?

这是调用以生成提要的控制器方法:

  def add_feed
    url = params['url']
    puts "FEEDJIRA"
    open url
    # feed = Feedjira::Feed.fetch_and_parse(url)
    # eventually return response... but we timeout on the line above
  end

这是上面的“url”命中的控制器(即“ http://lvh.me:3000/feeds/madonna.rss ”)以生成提要:

class FeedsController < ApplicationController

  def show
    respond_to do |format|
      format.rss  { render :layout => false }
    end
  end

end

这是日志:

env_host: lvh.me:3000
Host: lvh.me
   (0.9ms)  BEGIN
  SQL (0.7ms)  UPDATE "users" SET "last_seen_at" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["last_seen_at", "2018-01-08 19:47:29.215953"], ["updated_at", "2018-01-08 19:47:29.218610"], ["id", 3071]]
   (1.6ms)  COMMIT
FEEDJIRA
Started GET "/feeds/madonna.rss" for 127.0.0.1 at 2018-01-08 11:47:29 -0800
Completed 500 Internal Server Error in 120051ms (ActiveRecord: 7.3ms)



Net::ReadTimeout (Net::ReadTimeout):

app/controllers/registrations_controller.rb:105:in `add_feed'
4

3 回答 3

0

看起来它在 12+ 秒后就死了。里面有什么app/views/feeds/show.html.haml,这似乎是所有工作的内容?可能您需要找到一种方法来更快地生成该结果,例如通过缓存或确保您没有 n+1 问题或其他低效率问题。

于 2018-01-10T06:41:27.323 回答
0

失败 - 500 - 意味着服务器中的错误。客户与它无关。您不是在打开文件,而是在执行 HTTP 调用。错误代码意味着服务器认为调用需要太多,中断它并返回错误。如果您使用 Java 客户端或浏览器,也会出现同样的错误。

问题是您在服务器端的应用程序。既然你提到错误只发生在启动时,那会不会是服务器正在等待另一个连接,例如数据库,搜索等?

于 2018-01-15T19:06:14.733 回答
0

我有一个 Rails 控制器方法,它什么都不做,只是在同一台服务器上打开一个文件

当你这么说的时候,我期望那个动作会做File.open('path/to/some/local/file.txt')。这里发生了更多事情。您正在调用Kernel#openwhich 根据传递给它的输入执行不同的操作。假设输入看起来像一个 URL,它会打开一个连接以获取该 URL。

你传递的价值是params[:url]什么?您是否能够检查远程 URL 上的服务器日志以验证连接是否已建立?如果成立,是不是只是处理请求的时间比较长?您确定params[:url]可以从您的服务器访问吗?

于 2018-01-09T15:24:31.923 回答