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

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

大约每天一次,我收到一个SystemExit(stacktrace below)的错误邮件,其中对服务的调用失败了。 如果我随后在我的网站上尝试完全相同的查询,则可以正常工作。 自从网站上线以来,这种情况一直在发生,我没有找到导致它发生的原因的运气。

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 exit'/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:in to_proc '/usr/local/lib/ruby/1.8/net/protocol.rb:133:in'/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:in timeout'/usr/local/lib/ruby/1.8/timeout。 rb:76:超时'/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:在read_new'/usr/local/lib/ruby/1.8/net/http.rb:1047:in request'/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:in start'/usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'


使用fcgi与Ruby是众所周知的错误。

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


我使用FCGI已经有一段时间了,但如果线程耗时太长,我认为FCGI进程可能会抛出SystemExit。 这可能是Web服务没有响应,甚至是DNS查询缓慢。 一些谷歌的结果显示与Python和FCGI类似的错误,所以搬到杂种是一个好主意。 这篇文章是我用来设置杂种的参考资料,我仍然参考它。


我曾经一直在Apache1 / fastcgi上得到这些。 我认为这是由于Ruby完成之前fastcgi挂起造成的。

转向杂种是第一步,但还有更多的事情要做。 在活页上从Web服务中剔除,特别是来自Rails的是一个糟糕的主意。 Rails不是线程安全的。 可以支持的并发连接数等于群集中的杂类(或Passenger进程)数。

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

任何可能无法预测的缓慢需要在工作队列中发生。 / slow / action的第一个命令将作业添加到队列中,并且/ slow / action通过页面刷新或通过ajax进行查询来持续刷新,直到作业完成,然后从作业队列中获得结果。 现在Rails有几个工作队列,但最老的和可能使用最广泛的一个是BackgroundRB。

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

链接地址: http://www.djcxy.com/p/6597.html

上一篇: Frequent SystemExit in Ruby when making HTTP calls

下一篇: Django filter custom look up