Errno :: ETIMEDOUT:连接超时 - 连接(2)

时间:2012-02-20 22:33:30

标签: ruby-on-rails ruby-on-rails-3 amazon-s3 paperclip prawn

在制作中,我偶尔会收到以下错误:

Errno::ETIMEDOUT: Connection timed out - connect(2)

当我使用包含由paperclip / aws-sdk上传到s3的图像的prawn gem生成PDF时,似乎只会发生这种情况。这可能每周只发生几次,每天使用数百次(没有问题),但是当它失败时会导致500错误。

跟踪是:

/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`initialize'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`connect'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/timeout.rb:53:in
`timeout'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/timeout.rb:101:in
`timeout'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`connect'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:553:in
`do_start'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:542:in
`start'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:242:in
`open_http'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:616:in
`buffer_open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:164:in
`open_loop'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in
`catch'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in
`open_loop'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:132:in
`open_uri'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:518:in
`open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:30:in
`open'
....rb:57:in `render_image_to_pdf'

第57行:

pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20

设定:

Rails 3.0.10
Ruby 1.8.7EE
Prawn  0.11.1
AWS-SDK 1.3.3
Paperclip 2.5.2

我该怎么做才能防止此错误?

2 个答案:

答案 0 :(得分:8)

一种选择是捕获异常并再试一次:

begin
  pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20
rescue Errno::ETIMEDOUT
  # try one more time, or use retry with a counter to attempt a limited number of times
  pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20
end

您可能还需要进行一些诊断(记录或生成Airbrake)以通知您,以便您可以查看是否存在某种故障模式。

答案 1 :(得分:2)

使用aws-sdk生成新的服务器实例时,我在Amazon EC2中遇到了同样的错误。这就是我所知道的:

  1. 我有一个函数(sleep_while_not_running)来测试instance.status:

    def sleep_while_not_running(instance)     打印“等待系统:”     $ stdout.flush     而instance.status!=:正在运行         打印“。”         $ stdout.flush         睡觉1     结束     把“恢复”。 端

  2. 在sleep_while_not_running返回后,我假设我们应该能够连接(如下所示):

    Net::SSH.start(instance.ip_address,'root',:key_data=>[key_pair.private_key]) do |ssh|
    sleep_while_not_running(instance)
    puts "testing SSH connectivity."
    puts ssh.exec("uname -a")
    puts " "
    
  3. 您所描述的同一个超时错误会发生什么。手动调查,我发现 -

    一个。如果我等到“状态检查”(在管理控制台中)显示新实例已“通过2/2检查”,那么我可以使用脚本使用的相同密钥对手动SSH。

    湾sleep_while_not_running检查instance.status(在服务器完全烘焙之前说“运行”很久。

    ℃。我在aws-sdk中找不到调用来检查我在管理控制台中检查的“状态检查”,但我怀疑这是解决方案存在的地方。

  4. P.S。我意识到这不是一个“答案”,但它可能有助于确定解决方案。