Häufige Systemexit in Ruby, wenn HTTP-Anrufe

stimmen
18

Ich habe eine Ruby on Rails-Website, die HTTP-Anrufe an einen externen Web Service macht.

Etwa einmal pro Tag, als ich eine Systemexit (stacktrace unten) Fehler E-Mail erhalten, wo in den Dienst ein Anruf fehlgeschlagen ist. Wenn ich dann genau die gleiche Abfrage auf meiner Website Momente versuchen Sie es später funktioniert es gut. Es passiert seit der Website live gegangen und ich hatte kein Glück aufzuspüren, was es bewirkt.

Ruby ist Version 1.8.6 und Rails ist Version 1.2.6.

Sonst noch jemand dieses Problem?

Dies ist der Fehler und Stacktrace.

Ein Systemexit aufgetreten /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in Ausfahrt /usr/local/lib/ruby/gems/1.8/gems/ Schienen-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 nennen' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread‘/ usr / local / lib / Rubin / 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 starten‘ /usr/local/lib/ruby/1.8/net/http.rb:379:in GET RESPONSE‘

Veröffentlicht am 02/08/2008 um 18:26
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
8

Es ist schon eine Weile , da ich FCGI verwendet , aber ich denke , ein FCGI Prozess eine Systemexit werfen könnte , wenn der Faden zu lang nimmt. Dies könnte der Web - Service nicht reagiert oder sogar eine langsame DNS - Abfrage sein. Einige Google - Ergebnisse zeigen einen ähnlichen Fehler mit Python und FCGI so mongrel bewegt eine gute Idee wäre. Dieser Beitrag ist meine Referenz ich Setup Mischlings verwendet und ich beziehen sich noch auf ihn zurück.

Beantwortet am 03/08/2008 um 06:22
quelle vom benutzer

stimmen
8

Mit fcgi Ruby ist bekannt, sehr fehlerhaft zu sein.

Praktisch jeder hat zu bewegt Mischlings aus diesem Grund, und ich empfehle Ihnen das Gleiche tun.

Beantwortet am 02/08/2008 um 18:50
quelle vom benutzer

stimmen
5

Früher habe ich diese ganze Zeit auf Apache1 / FastCGI zu bekommen. Ich denke, es durch fastcgi verursacht wird auflegt, bevor Rubin getan.

Die Umstellung auf Mischlings ist ein guter erster Schritt, aber es gibt noch mehr zu tun. Es ist eine schlechte Idee von Web-Service auf Live-Seiten keulen, insbesondere von Rails. Schienen sind nicht threadsicher. Die Anzahl der gleichzeitigen Verbindungen können Sie gleich die Anzahl von Mischlingen (oder Passagierprozessen) im Cluster unterstützen.

Wenn Sie einen Mischlings haben und jemand Zugriff auf eine Seite, die einen Webdienst aufruft, die 10 Sekunden bis einer Auszeit nimmt, wird jede Anfrage auf Ihre Website während dieser Zeit Timeout. Die meisten der Loadbalancer nur Zyklus durch Ihre Bastarde blind, wenn Sie also zwei Bastarde haben, wird jede andere Anforderung Timeout.

Alles , was unvorhersehbar langsam sein kann muss in einer Auftragswarteschlange passieren. Der erste Hit / langsam / Aktion wird den Auftrag an die Warteschlange, und / langsam / Aktion hält über Seite aktualisiert oder Abfragen über Ajax auf erfrischende , bis der Auftrag abgeschlossen ist, und Sie dann Ihre Ergebnisse aus der Auftragswarteschlange bekommen. Es gibt ein paar Job - Warteschlangen für Rails heute, aber die älteste und wohl am weitesten verbreitete ist BackgrounDRb .

Eine weitere Alternative, je nach Art der App ist der Dienst alle N Minuten über cron keulen, zwischenspeichern die Daten lokal und haben Ihre Live-Seite aus dem Cache gelesen.

Beantwortet am 30/08/2008 um 05:55
quelle vom benutzer

stimmen
1

Ich würde auch einen Blick auf nehmen Passagiere . Es ist viel leichter zu bekommen gehen als die traditionelle Lösung von Apache / nginx + Mongrel.

Beantwortet am 11/08/2008 um 17:36
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more