¿Cuál es el estado actual de los procesos de subprocesamiento, concurrencia y bifurcación en Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/129226

  •  02-07-2019
  •  | 
  •  

Pregunta

Ruby on Rails no realiza muy bien las respuestas de solicitud multiproceso, o al menos, ActiveRecord no lo hace.

La noción de una sola solicitud-respuesta activa al mismo tiempo puede ser una molestia al crear aplicaciones web que desequilibran un comando de shell que tarda mucho en finalizar.

¿Cuáles son algunas de sus opiniones sobre este tipo de configuraciones? ¿Es posible que Rails no sea una buena opción para algunas aplicaciones?

Además, ¿cuál es el estado actual de las cosas con respecto a la concurrencia en Ruby on Rails? ¿Cuáles son las mejores prácticas? ¿Hay soluciones a las deficiencias?

¿Fue útil?

Solución

Rails actualmente no maneja solicitudes concurrentes dentro de un solo proceso de Ruby de MRI (Matz Ruby Interpreter). Cada solicitud se envuelve esencialmente con un mutex gigante. Se ha trabajado mucho para hacer que los próximos Rails 2.2 sean seguros para subprocesos, pero no obtendrá muchos beneficios de esto cuando se ejecute con Ruby 1.8x. No puedo comentar si Ruby 1.9 será diferente porque no estoy muy familiarizado con él, pero probablemente no lo hubiera pensado.

Un área que parece muy prometedora a este respecto es ejecutar Rails utilizando JRuby, porque generalmente se reconoce que JVM es bueno en subprocesamiento múltiple. Arun Gupta de Sun Microsystems dio algunos cifras de rendimiento interesantes en esta configuración en RailsConf Europe recientemente.

Otros consejos

Neverblock permite la funcionalidad sin bloqueo sin modificar la forma en que escribe los programas. Realmente es un proyecto de aspecto emocionante, y fue respaldado para trabajar en Ruby 1.8.x (se basa en las fibras de Ruby 1.9). Funciona con PostgreSQL y MySQL para realizar consultas sin bloqueo. Los puntos de referencia están locos ...

Matz's Ruby 1.8 usa hilos verdes , y Matz's Ruby 1.9 usará O / S nativo trapos. Otras implementaciones de Ruby 1.8, como JRuby y IronRuby, usan hilos nativos de O / S. YARV, abreviatura de Yet Another Ruby VM, también usa hilos nativos de O / S, pero tiene un bloqueo de intérprete global para garantizar que solo se ejecute un hilo Ruby en un momento dado.

Si lo que ejecuta en el shell no es necesario para la representación de la página (por ejemplo, solo está activando tareas de mantenimiento o algo así), debe comenzarlas como procesos en segundo plano. Echa un vistazo a starling y workling.

Si esto no se aplica a su situación, deberá asegurarse de que se ejecuten varias instancias de sus servidores de aplicaciones. Tradicionalmente la gente comenzaría múltiples instancias de mestizo. Pero ahora diría que la forma más fácil de tener una configuración sólida es, con mucho, usar Phusion Passenger . Es un módulo de Apache que le permite especificar fácilmente cuántas instancias (mín. Y máx.) De sus servidores de aplicaciones desea ejecutar. El pasajero hace el resto. Y si recuerdo correctamente, no es estúpido round robin para enviar solicitudes. Creo que es por disponibilidad.

Ruby 1.9 está agregando fibras ligeras:

http://www.infoq.com/news / 2007/08 / ruby-1-9-fibras

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