문제

외부 웹 서비스에 대한 HTTP 호출을 수행하는 Ruby on Rails 웹 사이트가 있습니다.

하루에 한 번씩 서비스 호출이 실패한 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/lib/ruby/1.8/net/protocol.rb:133:in 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 : 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 : 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 : 시작 '/usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'

도움이 되었습니까?

해결책

Ruby와 함께 fcgi를 사용하는 것은 버그가 매우 많은 것으로 알려져 있습니다.

거의 모든 사람들이 다음으로 이사했습니다. 똥개 그렇기 때문에 여러분도 그렇게 하시기를 권합니다.

다른 팁

FCGI를 사용한 지 꽤 됐지만 스레드가 너무 오래 걸리면 FCGI 프로세스에서 SystemExit가 발생할 수 있다고 생각합니다.이는 웹 서비스가 응답하지 않거나 느린 DNS 쿼리일 수 있습니다.일부 Google 결과에서는 Python 및 FCGI와 유사한 오류가 표시되므로 mongrel로 이동하는 것이 좋습니다. 이 게시물 잡종을 설정하는 데 사용한 참조이며 여전히 다시 참조합니다.

나는 항상 Apache1/fastcgi에서 이것들을 얻었습니다.내 생각엔 Ruby가 완료되기 전에 fastcgi가 중단되었기 때문인 것 같습니다.

잡종으로 전환하는 것이 좋은 첫 번째 단계이지만 아직 해야 할 일이 더 많습니다.특히 Rails에서 라이브 페이지의 웹 서비스를 수집하는 것은 좋지 않습니다.레일스는 스레드로부터 안전하지 않습니다.지원할 수 있는 동시 연결 수는 클러스터의 몽그렐(또는 승객 프로세스) 수와 같습니다.

잡종이 한 명 있고 시간 초과되는 데 10초가 걸리는 웹 서비스를 호출하는 페이지에 누군가 액세스하는 경우 웹 사이트에 대한 모든 요청은 해당 시간 동안 시간 초과됩니다.대부분의 로드 밸런서는 맹목적으로 잡종을 순환하므로 잡종이 두 개인 경우 다른 모든 요청은 시간 초과됩니다.

예측할 수 없을 정도로 느려질 수 있는 모든 작업은 작업 대기열에서 발생해야 합니다./slow/action에 대한 첫 번째 히트는 작업을 대기열에 추가하고 /slow/action 작업이 완료될 때까지 페이지 새로 고침이나 ajax를 통한 쿼리를 통해 계속 새로 고친 다음 작업 대기열에서 결과를 얻습니다.요즘 Rails에는 몇 가지 작업 대기열이 있지만 가장 오래되고 아마도 가장 널리 사용되는 대기열은 다음과 같습니다. 배경RB.

앱의 특성에 따른 또 다른 대안은 cron을 통해 N분마다 서비스를 수집하고 데이터를 로컬로 캐시한 다음 캐시에서 라이브 페이지를 읽는 것입니다.

나도 좀 살펴봐야겠다 승객.Apache/nginx + Mongrel의 기존 솔루션보다 훨씬 쉽게 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top