Pregunta

Tengo un sitio web Ruby on Rails que realiza llamadas HTTP a un servicio web externo.

Aproximadamente una vez al día recibo un correo electrónico de error SystemExit (stacktrace a continuación) en el que falló una llamada al servicio.Si luego intento exactamente la misma consulta en mi sitio momentos después, funciona bien.Ha estado sucediendo desde que el sitio se puso en marcha y no he tenido suerte de encontrar la causa.

Ruby es la versión 1.8.6 y Rails es la versión 1.2.6.

¿Alguien más tiene este problema?

Este es el error y el seguimiento de pila.

Ocurrió un sistema de systemEt /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in salir '/usr/local/lib/ruby/gems/1.8/gems/ Rails-1.2.6/lib/fcgi_handler.rb: 116: en 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 llamar' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread '/usr/local/ lib/ruby/1.8/net/protocol.rb: 133: en rbuf_fill '/usr/local/lib/ruby/1.8/timeout.rb:56:in timeout' /usr/local/lib/ruby/1.8/Terout. RB: 76: en Tiempo Tiempo '/usr/local/lib/ruby/1.8/net/protocol.rb:132:in rbuf_fill' /usr/local/lib/ruby/1.8/net/protocol.rb:116:in readuncil '/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: en read_new '/usr/local/lib/ruby/1.8/net/http.rb:1047:in request' /usr/local/lib/ruby/1.8/ net/http.rb: 945: en 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: en inicio '/usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'

¿Fue útil?

Solución

Se sabe que el uso de fcgi con Ruby tiene muchos errores.

Prácticamente todo el mundo se ha mudado a Mestizo Por este motivo, te recomiendo que hagas lo mismo.

Otros consejos

Ha pasado un tiempo desde que usé FCGI, pero creo que un proceso FCGI podría generar una salida del sistema si el hilo tarda demasiado.Esto podría deberse a que el servicio web no responde o incluso a una consulta de DNS lenta.Algunos resultados de Google muestran un error similar con Python y FCGI, por lo que sería una buena idea pasar a mestizo. Esta publicación es mi referencia que solía configurar mestizo y todavía me refiero a él.

Solía ​​​​obtenerlos todo el tiempo en Apache1/fastcgi.Creo que se debe a que fastcgi colgó antes de que Ruby terminara.

Cambiar a mestizo es un buen primer paso, pero hay más por hacer.Es una mala idea seleccionar servicios web en páginas activas, particularmente de Rails.Rails no es seguro para subprocesos.La cantidad de conexiones simultáneas que puede admitir es igual a la cantidad de mestizos (o procesos pasajeros) en su clúster.

Si tiene un mestizo y alguien accede a una página que llama a un servicio web que tarda 10 segundos en expirar, cada solicitud a su sitio web expirará durante ese tiempo.La mayoría de los balanceadores de carga simplemente recorren sus mestizos a ciegas, por lo que si tiene dos mestizos, todas las demás solicitudes expirarán.

Todo lo que pueda ser impredeciblemente lento debe ocurrir en una cola de trabajos.El primer acceso a /slow/action agrega el trabajo a la cola, y /slow/action continúa actualizándose mediante actualizaciones de página o consultas a través de ajax hasta que finaliza el trabajo, y luego obtiene los resultados de la cola de trabajos.Hoy en día existen algunas colas de trabajos para Rails, pero la más antigua y probablemente la más utilizada es AntecedentesRB.

Otra alternativa, dependiendo de la naturaleza de su aplicación, es seleccionar el servicio cada N minutos mediante cron, almacenar en caché los datos localmente y hacer que su página en vivo se lea desde la caché.

Yo también echaría un vistazo a Pasajero.Es mucho más fácil de poner en marcha que la solución tradicional de Apache/nginx + Mongrel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top