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

时间:2008-08-02 17:26:40

标签: ruby-on-rails ruby crash

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

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

Ruby是版本1.8.6,rails是版本1.2.6。

其他人有这个问题吗?

这是错误和堆栈跟踪。

  

发生了SystemExit   /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   exit_now_handler”   /usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:in   to_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 request'   /usr/local/lib/ruby/1.8/net/http.rb:945:in request_get'   /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 个答案:

答案 0 :(得分:9)

已知将fcgi与Ruby一起使用是非常错误的。

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

答案 1 :(得分:8)

自从我使用FCGI以来已经有一段时间了,但我认为如果线程耗时过长,FCGI进程可能会抛出SystemExit。这可能是Web服务没有响应甚至是慢速DNS查询。一些谷歌搜索结果显示与Python和FCGI有类似的错误,因此转向mongrel将是一个好主意。 This post是我用来设置mongrel的参考资料,我仍然会参考它。

答案 2 :(得分:5)

我过去常常在Apache1 / fastcgi上获取这些内容。我认为这是因为在Ruby完成之前fastcgi挂断了。

切换到mongrel是一个很好的第一步,但还有更多工作要做。从实时页面上的Web服务中剔除是一个坏主意,尤其是来自Rails。 Rails不是线程安全的。您可以支持的并发连接数等于群集中的mongrels(或Passenger进程)数。

如果您有一个杂种并且有人访问调用Web服务的页面需要10秒才能超时,那么对您网站的每个请求都将在此期间超时。大多数负载均衡器只是盲目地循环你的杂种,所以如果你有两个混蛋,那么每个其他请求都会超时。

任何可能无法预料的慢速都需要在作业队列中发生。第一次命中/ slow / action将作业添加到队列中,/ slow / action通过页面刷新或通过ajax查询继续刷新,直到作业完成,然后从作业队列中获取结果。现在有一些Rails的工作队列,但最古老且可能最广泛使用的工作队列是BackgroundRB

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

答案 3 :(得分:1)

我还要看一下Passenger。与传统的Apache / nginx + Mongrel解决方案相比,它更容易上手。