Sigo viendo en las ofertas de trabajo que el solicitante debe tener experiencia en la redacción de solicitudes «escalables». ¿Qué hace que una aplicación sea escalable y cómo sé que mi código puede escalar a millones de usuarios?
Creo que una mejor manera de formular esta pregunta es: ¿Cómo puedo escribir mi código con escalabilidad? ¿en mente? Para que el código sea escalable desde el principio en lugar de una ocurrencia tardía. ¿Existen determinadas metodologías de diseño? ¿O es simplemente una cuestión de elegir los algoritmos correctos para el trabajo?
Respuesta
Hay dos direcciones de escalabilidad:
- vertical (también conocido como escalado): CPU más rápida, más RAM, más espacio en disco;
- horizontal (también conocido como escalado): más núcleos en la CPU, más CPU, más servidores ;
Para el primero, solo debes 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 subprocesos o procesos, en algún momento llegará a los límites del sistema operativo. Es por eso que actualmente los servidores construidos para alta escalabilidad están realizando simultaneidad basada en eventos asincrónicos. Este problema se describe en el famoso C10K documento .
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 estar distribuidos físicamente. La comunicación entre los nodos debe ser limitada. En la práctica, eso generalmente significa sacrificar algunas partes de ACID (está demostrado que no se puede tener ACID completo y la capacidad de escalar horizontalmente al mismo tiempo). La solución más conocida para datos El almacenamiento en ese paradigma son las soluciones NoSQL . Varían desde almacenes de valores clave muy simples hasta sistemas similares a RDBMS, sin la capacidad de realizar uniones. div id = «73fab16cf2»>
tiendas de valores clave son ultra escalables, pero eso tiene un precio. Básicamente, solo puede consultar la clave principal. Sin embargo, existe una solución para eso, «es reducción de 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 masivamente en paralelo.
Si desea leer más sobre escalabilidad con ejemplos de la vida real , consulte el HighScalability.com blog .
Comentarios
- +1 por mencionar la escala horizontal. 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, tienes un problema mayor.
Responder
La escalabilidad se mide en términos de rendimiento en función de alguna variable. Por ejemplo, el número de solicitudes por segundo con X usuarios. 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 para la escalabilidad es qué medición es más importante para su aplicación. Hay varias formas de medir la eficiencia , que es un componente clave de la escalabilidad:
- Solicitudes simultáneas por segundo
- Tiempo promedio de respuesta por solicitud
- Número de registros procesados por segundo / minuto
Hay más medidas 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 de aumentar la carga son:
- Más usuarios ingresan al servidor (es decir, más tráfico web)
- Más datos en la base de datos (es decir, las consultas demoran más o el procesamiento más largo)
- Fallo del disco duro en un RAID (el rendimiento / confiabilidad del almacenamiento se ve afectado)
- Saturación de la red
El objetivo de una aplicación escalable es para mantener o mejorar la eficiencia mientras nos ocupamos del problema de carga. En resumen, si el tiempo de respuesta es demasiado largo, ¿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 funcionando en ese «punto óptimo» de eficiencia.
Su aplicación deberá estar diseñada específicamente para escalar. Eso significa que usted Hay que tener cuidado con los datos de la sesión, enrutar las solicitudes al servidor correcto y reducir los cuellos de botella que limitan la capacidad de escala de la aplicación.
Respuesta
Básicamente, desea evitar cuellos de botella de rendimiento cuando aumenta el número de usuarios y / o procesa un conjunto de datos más grande y / o ofrecer su interfaz en más idiomas, etc.
Básicamente, echa un vistazo al esquema de su base de datos, sus algoritmos y su proceso de desarrollo de software y trata de 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!
Responder
La única forma en que las aplicaciones puede ser realmente escalable, es al no tener restricciones que no se puedan pasar (o que sean muy costosas).
Un ejemplo típico es lo que sucede cuando te quedas sin ciclos de cpu disponibles. Si su programa es multiproceso, puede ejecutarlo en una caja con varios núcleos, pero ¿qué sucede cuando ya no puede comprar una caja más grande? Su aplicación simplemente no puede crecer más y, por lo tanto, no es escalable.
Cualquier aplicación verdaderamente escalable debe poder extenderse en múltiples computadoras de una manera transparente y hacerlo sin golpes notables. Esto no es fácil y es una de las razones por las que Google ha tenido tanto éxito.
Respuesta
Hay problemas únicos que vienen con el soporte de aplicaciones de gran escala. El puesto de trabajo busca candidatos que hayan trabajado en ese entorno y hayan tenido que resolver esos problemas.
Desde una aplicación de alto nivel, las aplicaciones se hacen escalables al preguntar constantemente qué sucedería si se solicitara que este fragmento de 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 en sí mismas, etc.
Respuesta
Si estuviera la creación de una función de búsqueda que funcionó bien cuando tiene 100 filas en la base de datos para buscar y 10 usuarios la usan a la vez. ¿Qué tan bien funcionaría cuando 100 usuarios la usaran al mismo tiempo y hay 100.000 filas para buscar?
Si tiene el mismo rendimiento sin importar qué, entonces es muy bueno. Si funciona de manera proporcional a la cantidad de usuarios / datos (es decir, 10 veces más datos == 10 veces más de procesamiento), eso es bueno. Si funciona mucho más baja cuanto más datos tenga (datos en modo 10x == 10x ^ 10 más para procesar), entonces no se escala bien.
Mis ejemplos realmente deberían mostrarse en notación Big O, pero cu Actualmente no lo conozco lo suficientemente bien 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.