Domanda

Ho un Ruby on Rails Sito web che rende HTTP chiama per un Servizio Web esterno.

Circa una volta al giorno ho un SystemExit (stacktrace al di sotto di errore e-mail in cui una chiamata al servizio non è riuscita.Se poi provare esattamente la stessa query sul mio sito istanti più tardi, funziona benissimo.E ' accaduto dal momento che il sito è andato in diretta e ho avuto fortuna di rintracciare quali sono le cause.

Ruby è la versione 1.8.6 e rails è la versione 1.2.6.

Qualcun altro ha questo problema?

Questo è l'errore e stacktrace.

Un SystemExit si è verificato /usr/local/lib/ruby/gemme/1.8/gemme/rails-1.2.6/lib/fcgi_handler.rb:116:in uscita /usr/local/lib/ruby/gemme/1.8/gemme/rails-1.2.6/lib/fcgi_handler.rb:116:in exit_now_handler' /usr/local/lib/ruby/gemme/1.8/gemme/activesupport-1.4.4/lib/active_support/inflector.rb:250:in to_proc' /usr/local/lib/ruby/1.8/net/protocollo.rb:133:in chiamata' /usr/local/lib/ruby/1.8/net/protocollo.rb:133:in sysread' /usr/local/lib/ruby/1.8/net/protocollo.rb:133:in rbuf_fill' /usr/local/lib/ruby/1.8/timeout.rb:56:timeout' /usr/local/lib/ruby/1.8/timeout.rb:76:in timeout" /usr/local/lib/ruby/1.8/net/protocollo.rb:132:in rbuf_fill' /usr/local/lib/ruby/1.8/net/protocollo.rb:116:in readuntil' /usr/local/lib/ruby/1.8/net/protocollo.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 richiesta' /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'

È stato utile?

Soluzione

Utilizzando fcgi con Ruby è noto per essere molto instabile.

Praticamente tutti si è spostata Cagnaccio per questo motivo, e mi consiglia di fare lo stesso.

Altri suggerimenti

E 'stato un po' dato che ho usato FCGI, ma penso che un FCGI processo potrebbe lanciare una SystemExit se il thread è troppo lungo.Questo potrebbe essere il web service non risponde o anche un lento query DNS.Alcuni risultati di google mostrano un errore simile con Python e FCGI così di trasferirsi a bastardo sarebbe una buona idea. Questo post è il mio punto di riferimento che ho usato per l'installazione di meticcio e ho ancora fare riferimento ad esso.

Ho usato per ottenere questi per tutto il tempo su Apache1/fastcgi.Penso che sia causato da fastcgi appendere prima di Ruby è fatto.

Il passaggio a mongrel è un buon primo passo, ma c'è ancora da fare.E ' una cattiva idea per abbattere dai servizi web su live pagine, in particolare dalle Guide.Guide non è thread-safe.Il numero di connessioni simultanee che si può sostenere è uguale al numero di meticci (o Passeggero processi) nel cluster.

Se si dispone di un meticcio e un utente accede a una pagina che si chiama un servizio web che prende 10 secondi di tempo, ogni richiesta per il tuo sito web in timeout durante quel tempo.La maggior parte dei bilanciatori di carico basta scorrere le meticci ciecamente, quindi, se avete due meticci, ogni altra richiesta di timeout.

Tutto ciò che può essere imprevedibile lento deve accadere in una coda di lavoro.Il primo colpo a /lento/azione si aggiunge il lavoro di coda, e /lento/azione mantiene sull'aggiornamento di via refresh di pagina o query tramite ajax fino a quando il lavoro è finito, e quindi ottenere i risultati da coda.Ci sono un paio di code di lavoro per Guide di oggi, ma la più antica e probabilmente più diffusa è BackgroundRB.

Un'altra alternativa, a seconda della natura della vostra applicazione, è quello di abbattere il servizio ogni N minuti tramite cron, cache i dati localmente, e la vostra pagina in lettura dalla cache.

Vorrei anche dare un'occhiata al Passeggero.È molto più facile per andare avanti rispetto alla tradizionale soluzione di server Apache/nginx + Bastardo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top