Häufiger SystemExit in Ruby beim Tätigen von HTTP-Aufrufen

Translate

Ich habe eine Ruby on Rails-Website, die HTTP-Aufrufe an einen externen Webdienst ausführt.

Ungefähr einmal am Tag erhalte ich eine SystemExit-Fehler-E-Mail (Stacktrace unten), in der ein Aufruf des Dienstes fehlgeschlagen ist. Wenn ich dann genau die gleiche Abfrage auf meiner Website versuche, funktioniert sie einwandfrei. Es ist passiert, seit die Seite online gegangen ist und ich hatte kein Glück, herauszufinden, was es verursacht.

Ruby ist Version 1.8.6 und Rails ist Version 1.2.6.

Hat noch jemand dieses Problem?

Dies ist der Fehler und die Stapelverfolgung.

Ein SystemExit ist aufgetreten /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: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: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 '

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

Alle Antworten

Translate

Die Verwendung von fcgi mit Ruby ist bekanntermaßen sehr fehlerhaft.

Praktisch jeder ist umgezogenMischlingAus diesem Grund empfehle ich Ihnen, dasselbe zu tun.

Quelle
Translate

Es ist schon eine Weile her, dass ich FCGI verwendet habe, aber ich denke, ein FCGI-Prozess könnte einen SystemExit auslösen, wenn der Thread zu lange dauert. Dies kann der Webdienst sein, der nicht antwortet, oder sogar eine langsame DNS-Abfrage. Einige Google-Ergebnisse zeigen einen ähnlichen Fehler bei Python und FCGI. Daher ist es eine gute Idee, zu Mongrel zu wechseln.Dieser Beitragist meine Referenz, die ich verwendet habe, um Mischlinge einzurichten, und ich beziehe mich immer noch darauf.

Quelle
cpm
Translate

Ich habe diese immer auf Apache1 / fastcgi bekommen. Ich denke, es liegt daran, dass Fastcgi auflegt, bevor Ruby fertig ist.

Der Wechsel zu Mischling ist ein guter erster Schritt, aber es gibt noch mehr zu tun. Es ist eine schlechte Idee, Webdienste auf Live-Seiten, insbesondere von Rails, zu entfernen. Schienen sind nicht fadensicher. Die Anzahl der gleichzeitigen Verbindungen, die Sie unterstützen können, entspricht der Anzahl der Mischlinge (oder Passagierprozesse) in Ihrem Cluster.

Wenn Sie einen Mischling haben und jemand auf eine Seite zugreift, die einen Webdienst aufruft, dessen Zeitüberschreitung 10 Sekunden dauert, tritt bei jeder Anforderung an Ihre Website während dieser Zeit eine Zeitüberschreitung auf. Die meisten Load Balancer durchlaufen Ihre Mischlinge nur blind. Wenn Sie also zwei Mischlinge haben, tritt bei jeder zweiten Anforderung eine Zeitüberschreitung auf.

Alles, was unvorhersehbar langsam sein kann, muss in einer Jobwarteschlange geschehen. Der erste Treffer für / slow / action fügt den Job der Warteschlange hinzu, und / slow / action wird weiterhin über Seitenaktualisierungen oder Abfragen über Ajax aktualisiert, bis der Job beendet ist. Anschließend erhalten Sie Ihre Ergebnisse aus der Jobwarteschlange. Heutzutage gibt es einige Job-Warteschlangen für Rails, aber die älteste und wahrscheinlich am weitesten verbreitete ist dieHintergrundRB.

Eine andere Alternative, abhängig von der Art Ihrer App, besteht darin, den Dienst alle N Minuten über cron auszusortieren, die Daten lokal zwischenzuspeichern und Ihre Live-Seite aus dem Cache lesen zu lassen.

Quelle
Translate

Ich würde auch einen Blick darauf werfenPassagier. Es ist viel einfacher als die traditionelle Lösung von Apache / Nginx + Mongrel.

Quelle