Compartir vía


Diseño de escalado horizontal

Diseñe la aplicación para que se pueda escalar horizontalmente.

Una ventaja importante de la nube es el escalado elástico: la capacidad de usar tanta capacidad según sea necesario, escalando horizontalmente cuando aumente la carga y reduciendo horizontalmente cuando no se requiera la capacidad adicional. Diseñe la aplicación para que pueda escalarse horizontalmente, agregando o quitando instancias ajustando la oferta a la demanda.

La escalabilidad se mide por la relación entre el aumento del rendimiento y el incremento de los recursos. Idealmente, en un sistema bien diseñado, ambas cifras son proporcionales: una asignación doble de recursos duplicará el rendimiento. La escalabilidad suele verse limitada por la introducción de cuellos de botella o puntos de sincronización en el sistema.

Recomendaciones

Evite la permanencia de las instancias. La permanencia, o la afinidad de la sesión, se produce cuando las solicitudes del mismo cliente se enrutan siempre al mismo servidor. La permanencia limita la capacidad de la aplicación de escalar horizontalmente. Por ejemplo, el tráfico de un usuario de gran volumen no se distribuirá entre las instancias. Entre las causas de esta permanencia está el almacenamiento del estado de sesión en la memoria y el uso de claves específicas del equipo para el cifrado. Asegúrese de que cualquier instancia puede controlar cualquier solicitud.

Identifique los cuellos de botella. El escalado horizontal no es una solución mágica para todos los problemas de rendimiento. Por ejemplo, si la base de datos de back-end es el cuello de botella, no ayudará el hecho de agregar más servidores web. Identifique y resuelva los cuellos de botella del equipo antes de lanzar más instancias al problema. Los elementos con estado del sistema son la causa más probable de los cuellos de botella.

Descomponga las cargas de trabajo de acuerdo con los requisitos de escalabilidad. A menudo, las aplicaciones constan de varias cargas de trabajo, con diferentes requisitos para el escalado. Por ejemplo, una aplicación podría tener un sitio orientado al público y un sitio de administración independiente. El sitio público puede experimentar un repentino aumento de tráfico, mientras que el sitio de administración tiene una carga más pequeña y predecible.

Diseñe componentes autónomos y desacoplados que se comuniquen a través de protocolos de comunicación asincrónicos. Lo ideal es que los componentes tengan su propio estado independiente y usen eventos para comunicar cualquier cambio o actividad a componentes externos. Esto ayuda a escalar de forma independiente solo el componente sobrecargado. Implemente mecanismos de control de flujo para administrar el tráfico y degradarlo correctamente. Los consumidores deben controlar su propia tasa de consumo. Los productores deben controlar su propia velocidad de transmisión, incluida la detención. Las colas de mensajes son buenas opciones para absorber cargas de trabajo adicionales y para permitir a los consumidores consumir el trabajo a su antojo.

Evite la comunicación, coordinación y espera innecesarias.

Descarga de tareas naturalmente asíncronas. Tareas como enviar correos electrónicos, acciones en las que el usuario no necesita una respuesta inmediata y la integración con otros sistemas son buenas oportunidades para usar patrones de mensajería asincrónica.

Descargue tareas que consumen muchos recursos. Las tareas que requieren una gran cantidad de CPU o recursos de E/S se deben mover a trabajos en segundo plano cuando sea posible, a fin de reducir la carga en el front-end que está controlando las solicitudes de usuario.

Escalado automático basado en métricas de uso en directo y uso de características integradas de escalado automático. Muchos servicios de proceso de Azure tienen compatibilidad integrada con el escalado automático. Si la aplicación tiene una carga de trabajo predecible y regular, aplique el escalado horizontal según una programación. Por ejemplo, escale horizontalmente durante el horario laboral. En caso contrario, si la carga de trabajo no es predecible, use métricas de rendimiento como la longitud de cola de solicitudes o la CPU para activar el escalado automático. Observe las aplicaciones y sus comunicaciones para identificar cuellos de botella y tomar decisiones más precisas. Para conocer los procedimientos recomendados del escalado automático, consulte Escalado automático.

Considere la posibilidad de utilizar un escalado automático agresivo para cargas de trabajo críticas. En el caso de las cargas de trabajo críticas, probablemente deseará anticiparse a la demanda. Es mejor agregar nuevas instancias rápidamente bajo una carga intensa para controlar el tráfico adicional y, a continuación, reducir el escalado gradualmente.

Aplique un diseño para la reducción horizontal. Recuerde que con el escalado elástico, la aplicación tendrá períodos de reducción horizontal durante los cuales se quitan instancias. La aplicación debe administrar correctamente las instancias que se quitan. Aquí se muestran algunas maneras de controlar la reducción horizontal:

  • Escuche los eventos de apagado (cuando estén disponibles) y apague correctamente.
  • Los clientes o los consumidores de un servicio deben admitir el control de errores transitorios y el reintento.
  • Para las tareas de ejecución prolongada, considere la posibilidad de dividir el trabajo mediante los puntos de control o el patrón Pipes and Filters.
  • Coloque los elementos de trabajo en una cola para que otra instancia puede recoger el trabajo, en caso de que se quite una instancia en medio de procesamiento.

Considere la posibilidad de escalar la redundancia. El escalado horizontal puede mejorar la confiabilidad de la aplicación. Por ejemplo, considere la posibilidad de escalar horizontalmente entre varias zonas de disponibilidad, como mediante el uso de servicios con redundancia de zona. Este enfoque puede mejorar el rendimiento de la aplicación, así como proporcionar resistencia si una zona experimenta una interrupción.

Modele y optimice la escalabilidad de su sistema. Puede modelar su sistema utilizando un enfoque como la ley de Amdahl. Cuantifique la escalabilidad basándose en parámetros como la contención y la coherencia. La contención se refiere al retraso debido a la espera o a las colas para obtener recursos compartidos. La coherencia se refiere al retraso para que los datos sean coherentes. Por ejemplo, tener una alta contención indica un procesamiento secuencial que podría paralelizarse, mientras que tener una alta coherencia sugiere dependencias excesivas entre procesos, lo que le incitará a minimizar las interacciones. Durante el diseño de la carga de trabajo, puedes calcular la capacidad efectiva máxima de tu sistema para evitar proporcionar más oferta que demanda, lo que conduce a despilfarro.