代码之家  ›  专栏  ›  技术社区  ›  Darren Greaves

在进行HTTP调用时,Ruby中经常出现SystemExit

  •  19
  • Darren Greaves  · 技术社区  · 17 年前

    我有一个RubyonRails网站,可以对外部Web服务进行HTTP调用。

    大约一天一次,我收到一封SystemExit(下面是StackTrace)错误电子邮件,其中对服务的调用失败。如果我稍后在我的网站上尝试完全相同的查询,它就会正常工作。 自从这个网站上线以来就发生了这种情况,我一直没有找到导致这种情况发生的原因。

    Ruby是1.8.6版,Rails是1.2.6版。

    其他人有这个问题吗?

    这是错误和stacktrace。

    出现系统退出 /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in 退出 /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in 退出“立即处理程序” /usr/local/lib/ruby/gems/1.8/gems/active support-1.4.4/lib/active_支持/inflector.rb:250:in 到“proc'/usr/local/lib/ruby/1.8/net/protocol.rb:133:in call' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in-rbuf-fill' /usr/local/lib/ruby/1.8/timeout.rb:56:in timeout' /usr/local/lib/ruby/1.8/timeout.rb:76:in timeout' /usr/local/lib/ruby/1.8/net/protocol.rb:132:in-rbuf-fill' /usr/local/lib/ruby/1.8/net/protocol.rb:116:in readuntil' /usr/local/lib/ruby/1.8/net/protocol.rb:126:in readline' /usr/local/lib/ruby/1.8/net/http.rb:2017:In read_status_line' /usr/local/lib/ruby/1.8/net/http.rb:2006:in read_new' /usr/local/lib/ruby/1.8/net/http.rb:1047:in请求' /usr/local/lib/ruby/1.8/net/http.rb:945:in请求“获取” /usr/local/lib/ruby/1.8/net/http.rb:380:in get_response' /usr/local/lib/ruby/1.8/net/http.rb:543:in start' /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'

    4 回复  |  直到 9 年前
        1
  •  9
  •   Michiel de Mare    17 年前

    将fcgi与ruby结合使用是非常麻烦的。

    实际上每个人都搬到了 Mongrel 因此,我建议你也这样做。

        2
  •  8
  •   Rais Alam    13 年前

    我使用fcgi已经有一段时间了,但我认为如果线程花费的时间太长,fcgi进程可能会抛出一个SystemExit。这可能是Web服务没有响应,甚至是一个缓慢的DNS查询。一些谷歌的结果显示,python和fcgi也有类似的错误,所以迁移到mongrel是个好主意。 This post 是我的参考资料,我以前设置了Mongrel,现在我仍然参考它。

        3
  •  5
  •   cpm    17 年前

    我以前经常在apache1/fastcgi上看到这些。我认为这是由在Ruby完成之前FastCGI挂断造成的。

    转向混血儿是一个很好的第一步,但还有更多的事情要做。从实时页面上的Web服务中挑选,特别是从Rails中挑选,这是一个坏主意。轨道不是线程安全的。您可以支持的并发连接数等于集群中的Mongrels(或乘客进程)数。

    如果您有一个Mongrel,并且有人访问一个调用超时时间为10秒的Web服务的页面,那么对您的网站的每个请求都将在这段时间内超时。大多数负载均衡器只是盲目地循环通过您的Mongrels,因此如果您有两个Mongrels,则每个其他请求都将超时。

    任何不可预知的缓慢都需要在作业队列中发生。第一次点击/slow/action会将作业添加到队列中,/slow/action会通过页面刷新或通过Ajax查询不断刷新,直到作业完成,然后从作业队列中获取结果。现在,有一些Rails的作业队列,但是最古老的,可能也是最广泛使用的一个是 BackgroundRB .

    另一种选择是,根据应用程序的性质,每隔n分钟通过cron剔除一次服务,在本地缓存数据,并从缓存中读取实时页面。

        4
  •  1
  •   Simon    17 年前

    我也会看看 Passenger . 它比传统的Apache/nginx+mongrel解决方案容易得多。

    推荐文章