在HTTP调用中Ruby中频繁的系统退出

Translate

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

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

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:退出时/usr/local/lib/ruby/gems/1.8/gems/ rails-1.2.6 / lib / fcgi_handler.rb:116:在exit_now_handler中/usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:在to_proc中'/usr/local/lib/ruby/1.8/net/protocol.rb:133:通话中'/usr/local/lib/ruby/1.8/net/protocol.rb:133:在sysread中'/ usr / local / lib / ruby / 1.8 / net / protocol.rb:133:在rbuf_fill中/usr/local/lib/ruby/1.8/timeout.rb:56:在超时中/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:在readline中'/usr/local/lib/ruby/1.8/net/http.rb:2017:在read_status_line中'/ usr / local / lib / ruby / 1.8 / net / http.rb:2006:在read_new中/usr/local/lib/ruby/1.8/net/http.rb:1047:在请求中/usr/local/lib/ruby/1.8/ net / http.rb:945:在request_get中/usr/local/lib/ruby/1.8/net/http.rb:380:i n get_response'/usr/local/lib/ruby/1.8/net/http.rb:543:在开始'/usr/local/lib/ruby/1.8/net/http.rb:379:在get_response'

This question and all comments follow the "Attribution Required."

所有的回答

Translate

众所周知,将fcgi与Ruby一起使用会带来很多麻烦。

几乎每个人都搬到了杂种因此,我建议您也这样做。

来源
Translate

自从我使用FCGI已经有一段时间了,但是我认为如果线程花费的时间太长,FCGI进程可能会抛出SystemExit。这可能是Web服务没有响应,甚至是缓慢的DNS查询。谷歌的一些结果显示Python和FCGI出现类似错误,因此改用杂种是个好主意。这个帖子是我用来设置杂种的参考,现在仍然参考。

来源
cpm
Translate

我以前一直在Apache1 / fastcgi上获取这些信息。我认为这是由于fastcgi在Ruby完成之前就挂断了。

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

如果您有一个杂种,并且有人访问一个调用Web服务的页面,该页面花费了10秒钟的超时时间,则对该网站的每个请求都将在该时间段内超时。大多数负载均衡器只是盲目的循环访问您的杂项,因此,如果您有两个杂项,则其他每个请求都会超时。

任何可能会缓慢地发生的事情都需要在作业队列中发生。 / slow / action的第一个匹配项将作业添加到队列中,/ slow / action继续通过页面刷新或ajax进行刷新,直到作业完成为止,然后从作业队列中获取结果。如今,Rails的工作队列很少,但是最古老且可能使用最广泛的队列是背景RB.

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

来源
Translate

我也会看一看乘客。它比Apache / nginx + Mongrel的传统解决方案容易得多。

来源