2

我正在使用 Typhoeus 处理我网站上对外部 API 的所有 HTTP 调用,直到最近它一直运行良好。一段时间后,我的 Rails 网站开始没有响应。我注意到当我执行 netstat 时,有大量的连接处于 CLOSE_WAIT 状态,它们是由以下代码生成的。

  requests = []
  hydra = Typhoeus::Hydra.new
  urls.each_with_index do |url, index|
    request = Typhoeus::Request.new(url, :timeout => 5000)
    request.on_complete do |response|
      begin
        resp = JSON.parse(response.body)

        if resp["error"]
          p "no deal found for #{factual_ids[index]}"
          { :deals => nil }
        else
          { :deals => resp["merchant"]["deals"] }
        end
      rescue Exception => e
        p e.message
        { :deals => nil }
      end
    end

    requests << request
    hydra.queue(request)
  end

  hydra.run

我发现与在其他 HTTP 调用中使用 Typhoeus 的方式不同的是,上面的 url 都是 HTTPS url。我不知道这是否有任何意义,但这是我此刻唯一能想到的。有没有人见过这个?是否有一个选项我可以传递到 Typheous 以在连接完成后强制关闭连接?

4

1 回答 1

2

您使用的是哪个操作系统和 Typhoeus 版本?一些使用 ubuntu 的人似乎遇到了类似的问题。Typhoeus 0.5 尚未发布,但它是支持 forbid_reuse 选项的候选版本。

Typhoeus::Request.new(url, :timeout => 5000, :forbid_reuse => true)

这就是问题所在:https ://github.com/typhoeus/typhoeus/issues/205 ,这里是 libcurl 文档:http ://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTFORBIDREUSE 。

Typhoeus 0.5 的代码如下所示:

requests = []
Typhoeus.on_complete do |response|
  begin
    resp = JSON.parse(response.body)

    if resp["error"]
      p "no deal found for #{factual_ids[index]}"
      response.options[:response_body] = { :deals => nil }
    else
      response.options[:response_body] = { :deals => resp["merchant"]["deals"] }
    end
  rescue Exception => e
    p e.message
    response.options[:response_body] = { :deals => nil }
  end
end

hydra = Typhoeus::Hydra.new
urls.each_with_index do |url, index|
  request = Typhoeus::Request.new(url, :timeout => 5000)
  requests << request
  hydra.queue(request)
end

hydra.run
于 2012-10-06T20:30:36.563 回答