Typhoeus不会关闭https连接

时间:2012-09-24 05:56:39

标签: ruby-on-rails http https connection-pooling typhoeus

我正在使用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网址。我不知道这是否有意义,但这是我现在唯一能想到的。谁看过这个吗?是否有一个选项可以传递给Typheous以强制关闭连接一旦完成?

1 个答案:

答案 0 :(得分: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