Vra

Ek het 'n Ruby on Rails-webwerf wat HTTP-oproepe na 'n eksterne webdiens maak.

Ongeveer een keer per dag kry ek 'n SystemExit (stacktrace hieronder) fout-e-pos waar 'n oproep na die diens misluk het.As ek dan oomblikke later presies dieselfde navraag op my webwerf probeer werk dit goed.Dit gebeur al sedert die werf in werking gestel is en ek het geen geluk gehad om op te spoor wat dit veroorsaak nie.

Ruby is weergawe 1.8.6 en rails is weergawe 1.2.6.

Enigiemand anders het hierdie probleem?

Dit is die fout en stapelspoor.

'N StelselExit het plaasgevind /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-10.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/inflektor.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/robyn/1.8/net/protokol.rb: 133: in rbuf_fill '/usr/local/lib/ruby/1.8/timeout.rb:56:in time -out' /usr/local/lib/ruby/1.8/timeOut. RB: 76: In time -out '/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 versoek' /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_reponse' /usr/local/lib/ruby/1.8/net/http.rb: 543: In die begin '/usr/local/lib/ruby/1.8/net/http.rb:379:in get_reponse'

Was dit nuttig?

Oplossing

Dit is bekend dat die gebruik van fcgi met Ruby baie karig is.

Feitlik almal het verhuis na Mengsel om hierdie rede, en ek beveel aan dat jy dieselfde doen.

Ander wenke

Dit is 'n rukkie sedert ek FCGI gebruik het, maar ek dink 'n FCGI-proses kan 'n SystemExit gooi as die draad te lank neem.Dit kan wees dat die webdiens nie reageer nie of selfs 'n stadige DNS-navraag.Sommige Google-resultate toon 'n soortgelyke fout met Python en FCGI, so dit sal 'n goeie idee wees om na baster te skuif. Hierdie pos is my verwysing wat ek gebruik het om baster op te stel en ek verwys steeds daarna terug.

Ek het dit altyd op Apache1/fastcgi gekry.Ek dink dit word veroorsaak deur fastcgi wat ophang voordat Ruby klaar is.

Om oor te skakel na baster is 'n goeie eerste stap, maar daar is meer om te doen.Dit is 'n slegte idee om van webdienste op regstreekse bladsye af te haal, veral van Rails.Relings is nie draad-veilig nie.Die aantal gelyktydige verbindings wat jy kan ondersteun, is gelyk aan die aantal mengsels (of Passasierprosesse) in jou groep.

As jy een baster het en iemand het toegang tot 'n bladsy wat 'n webdiens bel wat 10 sekondes neem om uit te skakel, sal elke versoek na jou webwerf gedurende daardie tyd uittel.Die meeste van die load balancers loop net blindelings deur jou mengsels, so as jy twee mengsels het, sal elke ander versoek uittel.

Enigiets wat onvoorspelbaar stadig kan wees, moet in 'n werksry gebeur.Die eerste treffer na /slow/action voeg die taak by die tou, en /slow/action hou aan om te verfris via bladsyverversings of navrae via ajax totdat die taak klaar is, en dan kry jy jou resultate uit die werkwaglys.Daar is deesdae 'n paar werksrye vir Rails, maar die oudste en waarskynlik mees gebruikte een is Agtergrond RB.

Nog 'n alternatief, afhangende van die aard van jou toepassing, is om die diens elke N minute via cron te verwyder, die data plaaslik te kas, en jou regstreekse bladsy uit die kas te laat lees.

Ek sal ook gaan kyk na Passasier.Dit is baie makliker om aan die gang te kom as die tradisionele oplossing van Apache/nginx + Mongrel.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top