¿Qué hace que una aplicación sea escalable?

37

Sigo viendo en las ofertas de trabajo que el solicitante debe tener experiencia escribiendo solicitudes "escalables". ¿Qué hace que una aplicación sea escalable y cómo sé que mi código puede escalar a millones de usuarios?


Supongo que una mejor forma de formular esta pregunta es: ¿Cómo puedo escribir mi código teniendo en cuenta la escalabilidad? Para que el código sea escalable desde el primer momento en lugar de una idea de último momento. ¿Existen ciertas metodologías de diseño? ¿O es simplemente una cuestión de elegir los algoritmos correctos para el trabajo?

jnevelson
fuente

Respuestas:

24

Hay dos direcciones de escalabilidad:

  • vertical (también conocido como ampliación): CPU más rápida, más RAM, más espacio en disco;
  • horizontal (también conocido como escalamiento horizontal): más núcleos en la CPU, más CPU, más servidores;

Para el primero, solo debe tener cuidado de no tener limitaciones arbitrarias. Esto se debe a tamaños enteros demasiado pequeños o estructuras de longitud fija / limitada. Estas estructuras pueden estar relacionadas con el sistema operativo subyacente. Por ejemplo, si intenta escalar utilizando más hilos o procesos, en algún momento alcanzará los límites del sistema operativo. Es por eso que actualmente los servidores construidos para alta escalabilidad están haciendo concurrencia basada en eventos asincrónicos. Este problema se describe en el famoso documento C10K .

El segundo es más difícil. Requiere programación con dos cosas en mente: los datos se procesarán en paralelo y los datos podrían distribuirse físicamente. La comunicación entre los nodos debe ser limitada. En la práctica, eso generalmente significa sacrificar algunas partes de ACID (está comprobado que no puede tener ACID completo y la capacidad de escalar al mismo tiempo). La solución más conocida para el almacenamiento de datos en ese paradigma son las soluciones NoSQL . Van desde almacenes de valores clave muy simples, hasta sistemas similares a RDBMS, solo despojados de la capacidad de hacer uniones. Las tiendas clave-valor son ultra escalables, pero eso tiene un precio. Básicamente, puede consultar solo en la clave principal. Sin embargo, hay una solución para eso, es reducir el mapa. Puede parecer muy subóptimo si observa el punto de vista de la complejidad acumulativa, pero debe tener en cuenta que se está ejecutando en paralelo de forma masiva.

Si desea leer más sobre la escalabilidad con ejemplos de la vida real, consulte el blog HighScalability.com .

vartec
fuente
+1 por mencionar escalar. Agregar más recursos es muy rápido y atractivo para los tomadores de decisiones (¡compre algunos núcleos hexadecimales y duplique la memoria!). Pero si la aplicación no puede presionarlos, tiene un problema mayor.
jqa
14

La escalabilidad se mide en términos de rendimiento en función de alguna variable. Por ejemplo, número de solicitudes / segundo con usuarios X. La forma más sencilla de describir la escalabilidad es:

Una medida de eficiencia a medida que aumenta la carga.

Lo primero que debe comprender al diseñar la escalabilidad es qué medida es más importante para su aplicación. Hay varias formas de medir la eficiencia, que es un componente clave de la escalabilidad:

  • Solicitudes concurrentes por segundo
  • Tiempo promedio de respuesta por solicitud
  • Número de registros procesados ​​por segundo / minuto

Hay más mediciones de eficiencia que se pueden usar, pero estas son comunes para sistemas basados ​​en web o sistemas de procesamiento por lotes.

El siguiente aspecto de la escalabilidad es medir lo que sucede con su eficiencia a medida que aumenta la carga. Las formas comunes para aumentar la carga son:

  • Más usuarios llegan al servidor (es decir, más tráfico web)
  • Más datos en la base de datos (es decir, las consultas tardan más o el procesamiento tarda más)
  • Falla del disco duro en un RAID (el rendimiento / confiabilidad del almacenamiento se ve afectado)
  • Saturación de red

El objetivo de una aplicación escalable es mantener o mejorar la eficiencia mientras lidiamos con el problema de carga. En resumen, si el tiempo de respuesta tarda demasiado, ¿podemos agregar otro servidor para distribuir la carga de manera uniforme? Este enfoque reduce la cantidad de trabajo que debe realizar un servidor y mantiene a los servidores operando en ese "punto óptimo" para mayor eficiencia.

Su aplicación deberá estar diseñada específicamente para escalar. Eso significa que debe tener cuidado con los datos de la sesión, las solicitudes de enrutamiento al servidor correcto, reduciendo los cuellos de botella que limitan la capacidad de escalar la aplicación.

Berin Loritsch
fuente
5

Básicamente, desea evitar cuellos de botella en el rendimiento cuando aumenta el número de usuarios y / o procesa un conjunto de datos más grande, y / u ofrece su interfaz en más idiomas, etc.

Básicamente, eche un vistazo a su esquema de base de datos, sus algoritmos y su proceso de desarrollo de software e intente predecir problemas futuros. También desea configurar la supervisión del rendimiento para identificar problemas cuando comienzan a acumularse.

Aprendí estos consejos cuando leí Creación de sitios web escalables (enlace a Amazon).

¡Espero que esto ayude!

louisgab
fuente
3

La única forma en que las aplicaciones pueden ser verdaderamente escalables es no tener restricciones que no se puedan pasar (o solo de manera muy costosa).

Un ejemplo típico es ¿qué sucede cuando te quedas sin ciclos de CPU disponibles? Si su programa es multiproceso, puede ejecutar en una caja con múltiples núcleos, pero ¿qué sucede cuando ya no puede comprar una caja más grande? Su aplicación simplemente ya no puede crecer y, por lo tanto, no es escalable.

Cualquier aplicación verdaderamente escalable debe poder extenderse a través de múltiples computadoras de manera transparente y hacerlo sin ningún obstáculo notable. Esto no es fácil, y es una de las razones por las cuales Google ha tenido tanto éxito.


fuente
1

Hay problemas únicos que vienen con el soporte de aplicaciones a gran escala. El anuncio de empleo busca solicitantes que hayan trabajado en ese entorno y hayan tenido que resolver tales problemas.

Las aplicaciones de alto nivel se hacen escalables al preguntar constantemente qué pasaría si se solicitara que este código se ejecutara miles de veces en un período muy pequeño. Esto significa administrar sus huellas de memoria, haciendo uso del almacenamiento en caché de totales y datos, utilizando fuentes de datos que son escalables, etc.

jzd
fuente
1

Si estaba creando una función de búsqueda que funcionó bien cuando tiene 100 filas en la base de datos para buscar y 10 usuarios la utilizan a la vez. Qué tan bien funcionaría cuando 100 usuarios lo usaran al mismo tiempo y hay 100K filas para buscar.

Si realiza lo mismo sin importar qué, entonces es muy bueno. si funciona proporcionalmente a la cantidad de usuarios / datos (es decir, 10 veces más datos = 10 veces más para procesar), eso es bueno. Si su rendimiento es mucho menor cuanto más datos tenga (10x datos de modo == 10x ^ 10 más tiempo para procesar), entonces no escalará bien.

Mis ejemplos realmente deberían mostrarse en notación Big O, pero actualmente no lo sé lo suficiente como para escribir los ejemplos en Big O.

Puede simular más datos volcando datos ficticios en su base de datos, y existen herramientas para simular más usuarios como Apache AB.

JD Isaacks
fuente