Estoy intentando comprender completamente las opciones para el manejo concurrente de solicitudes en Rack. Utilicé async_sinatra para crear una aplicación de sondeo largo, y ahora estoy experimentando con un rack de metal desnudo usando throw :async
y/o la bandera Thin's Thread. Me siento cómodo con el tema, pero hay algunas cosas que no puedo entender. (No, no estoy confundiendo la concurrencia para el paralelismo, y sí, entiendo las limitaciones impuestas por el GIL).Simultaneidad de rack: rack.multithread, async.callback o ambos?
Q1. Mis pruebas indican que thin --threaded
(es decir, rack.multithread=true
) ejecuta solicitudes simultáneamente en hilos separados (supongo que usando EM), lo que significa que la solicitud de larga ejecución A no bloqueará la solicitud B (IO a un lado). Esto significa que mi aplicación no requiere ninguna codificación especial (por ejemplo, devoluciones de llamada) para lograr la simultaneidad (una vez más, se ignoran las llamadas bloqueadas de DB, IO, etc.). Esto es lo que creo que he observado, ¿es correcto?
Q2. Hay otro medio más discutido para lograr la concurrencia, involucrando EventMachine.defer
y throw :async
. Estrictamente hablando, las solicitudes son no manejadas con hilos. Se tratan en serie, pero pasan su trabajo pesado y una devolución de llamada a EventMachine, que usa async.callback para enviar una respuesta en otro momento. Después de que la solicitud A haya descargado su trabajo a EM.defer, se inicia la solicitud B. ¿Es esto correcto?
Q3. Suponiendo que lo anterior sea más o menos correcto, ¿hay alguna ventaja particular en un método sobre el otro? Obviamente --threaded
parece una bala mágica. ¿Hay algún inconveniente? Si no, ¿por qué todos hablan de async_sinatra
/throw :async
/async.callback
? Quizás el primero es "Quiero hacer que mi aplicación Rails sea un poco más ágil bajo una gran carga" y esta última es más adecuada para aplicaciones con muchas solicitudes de larga ejecución. O tal vez la escala es un factor? Solo adivinando aquí.
Estoy ejecutando Thin 1.2.11 en MRI Ruby 1.9.2. (Para su información, tengo que usar la bandera --no-epoll
, ya que hay a long-standing, supposedly-resolved-but-not-really problem con el uso de EventMachine de epoll y Ruby 1.9.2 Ese no es el punto, pero alguna idea es bienvenida..)
El problema de epoll debe ser reparado como dice en ese ticket, esto es [el compromiso] (https://github.com/eventmachine/eventmachine/commit/d684cc3b77a6c401295a3086b5671fe4ec335a64) al que apuntan. – Bitterzoet
Si elimino el distintivo --no-epoll mis solicitudes de subprocesos pasan de milisegundos a minutos. EM 0.12.10, Ruby 1.9.2-p180. Supongo que podría intentar compilar p290 ... – bioneuralnet
Buena pregunta. He hecho una pregunta muy similar aquí: http://stackoverflow.com/questions/8146851/how-to-deploy-a-threadsafe-asynchronous-rails-app y he hecho algo de experimentación aquí: https: // github. com/jjb/threaded-rails-example (tenga en cuenta que aunque el subproceso enhebrado es asíncrono con éxito, es más lento) –