SystemExit fréquent dans Ruby lors des appels HTTP

Translate

J'ai un site Web Ruby on Rails qui effectue des appels HTTP vers un service Web externe.

Environ une fois par jour, je reçois un e-mail d'erreur SystemExit (trace de pile ci-dessous) où un appel au service a échoué. Si j'essaie ensuite exactement la même requête sur mon site quelques instants plus tard, cela fonctionne bien. Cela se produit depuis la mise en ligne du site et je n'ai pas eu la chance d'en trouver la cause.

Ruby est la version 1.8.6 et rails est la version 1.2.6.

Quelqu'un d'autre a ce problème?

C'est l'erreur et le stacktrace.

Une sortie système s'est produite /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: dans 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: dans 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: dans read_new '/usr/local/lib/ruby/1.8/net/http.rb:1047:in request' /usr/local/lib/ruby/1.8/ net / http.rb: 945: dans 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."

Toutes les réponses

Translate

L'utilisation de fcgi avec Ruby est connue pour être très boguée.

Pratiquement tout le monde a déménagéBâtardpour cette raison, et je vous recommande de faire de même.

La source
Translate

Cela fait un moment que j'ai utilisé FCGI mais je pense qu'un processus FCGI pourrait lancer un SystemExit si le thread prenait trop de temps. Cela peut être le service Web qui ne répond pas ou même une requête DNS lente. Certains résultats Google montrent une erreur similaire avec Python et FCGI, donc passer à un métis serait une bonne idée.Ce postest ma référence que j'ai utilisée pour configurer mongrel et je me réfère toujours à elle.

La source
cpm
Translate

J'avais l'habitude de les obtenir tout le temps sur Apache1 / fastcgi. Je pense que c'est dû au fait que Fastcgi a raccroché avant que Ruby ne soit terminé.

Passer à la métisse est une bonne première étape, mais il reste encore beaucoup à faire. C'est une mauvaise idée de cueillir des services Web sur des pages en direct, en particulier de Rails. Rails n'est pas thread-safe. Le nombre de connexions simultanées que vous pouvez prendre en charge est égal au nombre de mongrels (ou processus Passenger) dans votre cluster.

Si vous avez un bâtard et que quelqu'un accède à une page qui appelle un service Web qui prend 10 secondes pour expirer, chaque demande à votre site Web expirera pendant ce temps. La plupart des équilibreurs de charge parcourent vos métis à l'aveugle, donc si vous avez deux métis, toutes les autres requêtes expireront.

Tout ce qui peut être d'une lenteur imprévisible doit se produire dans une file d'attente de travaux. Le premier appel à / slow / action ajoute le travail à la file d'attente, et / slow / action continue de s'actualiser via des actualisations de page ou des requêtes via ajax jusqu'à ce que le travail soit terminé, puis vous obtenez vos résultats à partir de la file d'attente des travaux. Il y a quelques files d'attente de travaux pour Rails de nos jours, mais la plus ancienne et probablement la plus utilisée estContexteRB.

Une autre alternative, en fonction de la nature de votre application, consiste à supprimer le service toutes les N minutes via cron, à mettre en cache les données localement et à faire lire votre page en direct à partir du cache.

La source
Translate

Je voudrais aussi jeter un oeil àPassager. C'est beaucoup plus facile à démarrer que la solution traditionnelle d'Apache / nginx + Mongrel.

La source