23

我有一个 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 exit' /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:在 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

4 回答 4

9

众所周知,在 Ruby 中使用 fcgi 是非常错误的。

几乎每个人都因为这个原因搬到了Mongrel,我建议你也这样做。

于 2008-08-02T17:50:34.987 回答
8

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

于 2008-08-03T05:22:20.457 回答
5

我过去常常在 Apache1/fastcgi 上得到这些。我认为这是由于在 Ruby 完成之前 fastcgi 挂断造成的。

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

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

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

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

于 2008-08-30T04:55:25.743 回答
1

我也会看看Passenger。它比传统的 Apache/nginx + Mongrel 解决方案容易上手。

于 2008-08-11T16:36:06.327 回答