¿Cuál es la mejor manera de escalar una aplicación Rails?

Hola,

Todos los enfoques muy interesantes sobre los comentarios anteriores, y una buena base sobre la cual construir.

Conocer cómo se comporta es el objetivo aquí. Los patrones de tráfico, el tamaño del conjunto de datos manejado por las solicitudes, el tiempo necesario para interactuar con servicios externos, el uso de recursos, todo ayudará a tener que escalar una aplicación.

En cuanto a la ejecución en AWS (o cualquier nube que proporcione máquinas virtuales), querrá tener un equilibrador de carga HTTP / HTTPS al frente para distribuir el tráfico a una granja de instancias que ejecutan un servidor HTTP / HTTPS (idealmente Nginx) y el servidor de aplicaciones del Rail . Al ejecutarse de esta manera, tendrá la flexibilidad del servidor HTTP / HTTPS para atender las solicitudes que no sean de Rails (como la búsqueda de activos), lo que proporcionará terreno para agregar una CDN en el futuro, dejando a la aplicación Rails el trabajo que hace mejor.

Si la aplicación se basa en una base de datos de cualquier tipo, a medida que aumenta el uso de db, puede considerar dividir las solicitudes de escritura y lectura, con la primera yendo a una instancia de base de datos maestra y la segunda a réplicas de solo lectura.

Muchas aplicaciones de Rails ‘subcontratan’ trabajos en segundo plano para poner en cola el procesador como Delayed Job, Resque o Sidekiq. Dependiendo de su crítica, uso de recursos, tiempo de ejecución, etc., puede considerar ejecutarlos también en instancias dedicadas.

Una cosa a tener en cuenta también, que puede parecer obvio al principio pero que tendemos a olvidar cuando hablamos de escalabilidad, son los costos operativos. A veces, usar un conjunto de instancias más grande y distribuir el trabajo entre ellas tiene más sentido económico / financiero que administrar un grupo más grande de otras más pequeñas. Además, las instancias basadas en el crédito como la familia t2 de AWS pueden mantener bajos los costos para cargas como trabajos en segundo plano que se ejecutan solo durante un período fijo de tiempo.

Saludos,

Daniel Valfre

Desafortunadamente, debido a la metodología de enrutamiento empleada por Heroku en la pila Cedar (aleatoria), el escalado horizontal en realidad no es lineal. Cada dinamómetro adicional aumentará el rendimiento, pero menos que el anterior.

La mayoría de las aplicaciones experimentarán mejores resultados al escalar el tamaño de cada dinamómetro a los dinamómetros 2X o PX que al aumentar el número de dinamómetros.

En general, si va a escalar usuarios y volumen de tráfico para una aplicación más allá de los niveles moderados, necesitará dividir su aplicación en servicios más pequeños que puedan ejecutarse en plataformas que se adapten bien, y luego compóngalas juntas.

En cuanto a escalar sin emplear servicios o abandonar Heroku, su mejor opción es invertir demasiado en el almacenamiento en caché, el procesamiento en segundo plano y responder a las solicitudes rápidamente para evitar la cola de solicitudes (que, desafortunadamente, puede ser difícil en 1x dynos).

Recoge métricas. Este podría ser un problema complicado sin datos que respalden “qué tan bien” lo ha escalado, es decir, solicitudes por segundo antes y después

Sugeriría activar otro entorno (no de producción) con una configuración similar a Prod y ejecutar algunas pruebas de carga contra él. Si de hecho la aplicación necesita algún ajuste, continúe, después de cada cambio, ejecute nuevamente las pruebas de carga: un cambio podría ser escalar instancias o mejorar una consulta de base de datos.

Idealmente, antes de ejecutar pruebas de carga, tiene algunas cifras que le gustaría alcanzar en lugar de seguir cargando hasta que se rompa. Algo como “la aplicación debería ser capaz de manejar el uso máximo, que es X usuarios conectados” que luego equivale a x solicitudes por segundo.

Puede intentar escalar el número de dinamómetros para mantener el ritmo con el aumento del tráfico (Escalando su formación de dinamómetro). También puede consultar un complemento como este (Adept Scale | Complementos | Heroku) que automatizaría el proceso. ¡Impresionante que esté recibiendo suficiente tráfico como para que esto sea un problema!

Gire el complemento gratuito New Relic en Heroku y encontrará todos los cuellos de botella. Arregla cada uno.

Si está creciendo rápidamente, es posible que necesite la versión paga.

Hay una gran serie de videos de Greg Pollack sobre rieles de escala que generalmente es una buena introducción para escalar si puedes encontrarla.