¿Qué es la escalabilidad del software y por qué su empresa debería tomarla en serio?

Publicado: 2023-08-01

Incluso las empresas experimentadas y exitosas pueden tener problemas con la escalabilidad. ¿Recuerdas la aplicación Aplausos de Disney? Permitió a los usuarios interactuar con diferentes programas de Disney. Cuando la aplicación apareció en Google Play, fue extremadamente popular. Sin embargo, no es tan escalable. No podía manejar una gran cantidad de fanáticos, lo que resultaba en una experiencia de usuario deficiente. La gente estaba furiosa, dejando comentarios negativos y una calificación de una estrella en Google Play. La aplicación nunca se recuperó de esta publicidad negativa.

Puede evitar problemas como este si presta atención a la escalabilidad del software durante las primeras etapas de desarrollo, ya sea que lo implemente usted mismo o utilice servicios de ingeniería de software.

Entonces, ¿qué es la escalabilidad en el software? ¿Cómo asegurarse de que su solución sea escalable? ¿Y cuándo necesitas empezar a escalar?

¿Qué es la escalabilidad del software?

Gartner define la escalabilidad como la medida de la capacidad de un sistema para disminuir o aumentar el rendimiento y el costo en respuesta a los cambios en las demandas de procesamiento.

En el contexto del desarrollo de software, la escalabilidad es la capacidad de una aplicación para manejar la variación de la carga de trabajo mientras agrega o elimina usuarios con costos mínimos. Por lo tanto, se espera que una solución escalable permanezca estable y mantenga su rendimiento después de un fuerte aumento de la carga de trabajo, ya sea esperado o espontáneo. Ejemplos de aumento de la carga de trabajo son:

  • Muchos usuarios accediendo al sistema simultáneamente
  • Ampliación de los requisitos de capacidad de almacenamiento
  • Mayor número de transacciones en proceso

Tipos de escalabilidad de software

Puede escalar una aplicación ya sea horizontal o verticalmente. Veamos cuáles son los beneficios y los inconvenientes de cada enfoque.

Escalabilidad horizontal del software (escalamiento horizontal)

Puede escalar el software horizontalmente mediante la incorporación de nodos adicionales en el sistema para manejar una mayor carga, ya que se distribuirá entre las máquinas. Por ejemplo, si una aplicación comienza a experimentar retrasos, puede escalar agregando otro servidor.

La escalabilidad horizontal es una mejor opción cuando no puede estimar cuánta carga tendrá que manejar su aplicación en el futuro. También es una opción de acceso para el software que necesita escalar rápidamente sin tiempo de inactividad.

Beneficios:

  • Resiliencia al fracaso. Si un nodo falla, otros tomarán el relevo
  • No hay período de inactividad durante el escalado, ya que no es necesario desactivar los nodos existentes mientras se agregan nuevos.
  • Teóricamente, las posibilidades de escalar horizontalmente son ilimitadas

Limitaciones:

  • Complejidad añadida. Debe determinar cómo se distribuye la carga de trabajo entre los nodos. Puede usar Kubernetes para la gestión de carga
  • Costos más altos. Agregar nuevos nodos cuesta más que actualizar los existentes
  • La velocidad general del software puede estar restringida por la velocidad de comunicación del nodo

Escalabilidad de software vertical (ampliación)

La escalabilidad vertical consiste en agregar más potencia al hardware existente. Si con la escalabilidad horizontal agregaría otro servidor para manejar la carga de una aplicación, aquí actualizará el servidor existente agregando más potencia de procesamiento, memoria, etc. Otra opción es eliminar el servidor anterior y conectar uno más avanzado y capaz en su lugar.

Este tipo de escalabilidad funciona bien cuando conoce la cantidad de carga adicional que necesita incorporar.

Beneficios:

  • No es necesario cambiar la configuración o la lógica de una aplicación para adaptarse a la infraestructura actualizada
  • Menores gastos, ya que cuesta menos actualizar que agregar otra máquina

Limitaciones:

  • Hay tiempo de inactividad durante el proceso de actualización
  • La máquina mejorada aún presenta un único punto de falla
  • Hay un límite de cuánto puede actualizar un dispositivo

Escalabilidad vertical vs. horizontal del software

Aquí hay una comparación de tablas que brinda una descripción general de los diferentes aspectos de ambos tipos de escalabilidad de software.

¿Cuándo es absolutamente necesaria la escalabilidad?

Muchas empresas dejan de lado la escalabilidad en la ingeniería de software en favor de costos más bajos y ciclos de vida de desarrollo de software más cortos. Y aunque hay algunos casos en los que la escalabilidad no es un atributo esencial de calidad del sistema, en la mayoría de las situaciones, debe considerarlo desde las primeras etapas del ciclo de vida de su producto.

Cuando la escalabilidad del software no es necesaria:

  • Si el software es una prueba de concepto (PoC) o un prototipo
  • Al desarrollar software interno para pequeñas empresas utilizado solo por empleados
  • Aplicación móvil/de escritorio sin back-end

Por lo demás, se recomienda encarecidamente buscar opciones de escalabilidad para estar listo cuando llegue el momento. ¿Y cómo sabes que es hora de escalar? Cuando note una degradación del rendimiento. Aquí hay algunas indicaciones:

  • Aumenta el tiempo de respuesta de la aplicación
  • Incapacidad para manejar solicitudes de usuarios concurrentes
  • Mayores tasas de error, como fallas de conexión y tiempos de espera
  • Los cuellos de botella se forman con frecuencia. No puede acceder a la base de datos, la autenticación falla, etc.

Consejos para construir software altamente escalable

La escalabilidad del software es mucho más barata y fácil de implementar si se considera desde el principio del desarrollo del software. Si tiene que escalar inesperadamente sin tomar los pasos necesarios durante la implementación, el proceso consumirá mucho más tiempo y recursos. Uno de esos enfoques es refactorizar el código, que es un esfuerzo duplicado, ya que no agrega ninguna característica nueva. Simplemente hace lo que debería haberse hecho durante el desarrollo.

A continuación, puede encontrar ocho consejos que lo ayudarán a crear software que sea más fácil de escalar en el futuro. La siguiente tabla divide los consejos en diferentes etapas de desarrollo de software.

Consejo n.º 1: opte por alojar en la nube para mejorar la escalabilidad del software

Tiene dos opciones para alojar sus aplicaciones, ya sea en la nube o en las instalaciones. O puede utilizar un enfoque híbrido.

Si opta por el modelo local , dependerá de su propia infraestructura para ejecutar aplicaciones, acomodar su almacenamiento de datos, etc. Esta configuración limitará su capacidad de escalar y la hará más costosa. Sin embargo, si opera en un sector fuertemente regulado, es posible que no tenga otra opción, ya que el alojamiento local le brinda más control sobre los datos.

Además, en algunos sectores, como la banca, el tiempo de manejo de las transacciones es fundamental y no puede darse el lujo de esperar a que la nube responda o tolerar cualquier tiempo de inactividad de los proveedores de la nube. Las empresas que operan en estas industrias están restringidas al uso de hardware específico y no pueden confiar en lo que ofrecen los proveedores de nube. Lo mismo ocurre con las aplicaciones de misión crítica sensibles al tiempo, como los vehículos automatizados.

Elegir servicios de computación en la nube le dará la posibilidad de acceder a recursos de terceros en lugar de utilizar su infraestructura. Con la nube, tiene una posibilidad casi ilimitada de escalar hacia arriba y hacia abajo sin tener que invertir en servidores y otro hardware. Los proveedores de la nube también son responsables de mantener y proteger la infraestructura.

Si trabaja en la industria de la salud, puede consultar nuestro artículo sobre computación en la nube en el sector médico.

Consejo n.º 2: utilice el equilibrio de carga

Si decide escalar horizontalmente, deberá implementar un software de equilibrio de carga para distribuir las solicitudes entrantes entre todos los dispositivos capaces de manejarlas y asegurarse de que ningún servidor se vea abrumado. Si un servidor deja de funcionar, un balanceador de carga redirigirá el tráfico del servidor a otras máquinas en línea que puedan manejar estas solicitudes.

Cuando se conecta un nuevo nodo, se convertirá automáticamente en parte de la configuración y también comenzará a recibir solicitudes.

Consejo n.º 3: guarde en caché todo lo que pueda

La memoria caché se utiliza para almacenar contenido estático y resultados precalculados a los que los usuarios pueden acceder sin necesidad de volver a realizar los cálculos.

Guarde en caché la mayor cantidad de datos posible para aliviar la carga de su base de datos. Configure su lógica de procesamiento de manera que los datos que rara vez se modifican pero que se leen con bastante frecuencia puedan recuperarse de una memoria caché distribuida. Esto será más rápido y menos costoso que consultar la base de datos con cada solicitud simple. Además, cuando algo no está en el caché pero se accede a él con frecuencia, su aplicación lo recuperará y guardará en caché los resultados.

Esto trae problemas, como con qué frecuencia debe invalidar el caché, cuántas veces se debe acceder a una parte de los datos para copiarlos en el caché, etc.

Consejo #4: Habilite el acceso a través de las API

Los usuarios finales accederán a su software a través de una variedad de clientes, y será más conveniente ofrecer una interfaz de programación de aplicaciones (API) que todos puedan usar para conectarse. Una API es como un intermediario que permite que dos aplicaciones hablen. Asegúrese de tener en cuenta diferentes tipos de clientes, incluidos teléfonos inteligentes, aplicaciones de escritorio, etc.

Tenga en cuenta que las API pueden exponerlo a vulnerabilidades de seguridad. Trate de abordar esto antes de que sea demasiado tarde. Puede usar puertas de enlace seguras, autenticación sólida, métodos de encriptación y más.

Consejo #5: Benefíciese del procesamiento asíncrono

Un proceso asíncrono es un proceso que puede ejecutar tareas en segundo plano. El cliente no necesita esperar los resultados y puede empezar a trabajar en otra cosa. Esta técnica permite la escalabilidad del software, ya que permite que las aplicaciones ejecuten más subprocesos, lo que permite que los nodos sean más escalables y manejen más carga. Y si entra una tarea que requiere mucho tiempo, no bloqueará la amenaza de ejecución y la aplicación aún podrá manejar otras tareas simultáneamente.

El procesamiento asincrónico también se trata de dividir los procesos en pasos cuando no es necesario esperar a que se complete un paso antes de comenzar el siguiente si esto no es crítico para el sistema. Esta configuración permite distribuir un proceso en varios subprocesos de ejecución, lo que también facilita la escalabilidad.

El procesamiento asíncrono se logra a nivel de código e infraestructura, mientras que el manejo de solicitudes asíncronas es a nivel de código.

Consejo n.º 6: opte por tipos de bases de datos que sean más fáciles de escalar, cuando sea posible

Algunas bases de datos son más fáciles de escalar que otras. Por ejemplo, las bases de datos NoSQL, como MongoDB, son más escalables que SQL. El MongoDB mencionado anteriormente es de código abierto y generalmente se usa para el análisis de big data en tiempo real. Otras opciones de NoSQL son Amazon DynamoDB y Google Bigtable.

SQL funciona bien cuando se trata de escalar las operaciones de lectura, pero se detiene en las operaciones de escritura debido a su conformidad con los principios ACID (atomicidad, consistencia, aislamiento y durabilidad). Por lo tanto, si estos principios no son la principal preocupación, puede optar por NoSQL para escalar más fácilmente. Si necesita confiar en bases de datos relacionales, por coherencia o por cualquier otra cuestión, aún es posible escalar utilizando fragmentación y otras técnicas.

Sugerencia n.º 7: elija microservicios en lugar de arquitectura monolítica, si corresponde

Arquitectura monolítica

El software monolítico se construye como una sola unidad que combina operaciones del lado del cliente y del lado del servidor, una base de datos, etc. Todo está estrechamente acoplado y tiene una base de código única para todas sus funciones. No puede simplemente actualizar una parte sin afectar el resto de la aplicación.

Es posible escalar el software monolítico, pero debe escalarse de manera holística utilizando el enfoque de escalado vertical, que es costoso e ineficiente. Si desea actualizar una parte específica, no hay escapatoria para reconstruir y volver a implementar toda la aplicación. Por lo tanto, opte por una solución monolítica si su solución no es compleja y solo será utilizada por un número limitado de personas.

Arquitectura de microservicios

Los microservicios son más flexibles que los monolitos. Las aplicaciones diseñadas con este estilo constan de muchos componentes que funcionan juntos pero se implementan de forma independiente. Cada componente ofrece una funcionalidad específica. Los servicios que constituyen una aplicación pueden tener diferentes pilas tecnológicas y acceder a diferentes bases de datos. Por ejemplo, una aplicación de comercio electrónico creada como microservicios tendrá un servicio para la búsqueda de productos, otro para los perfiles de usuario, otro para el manejo de pedidos, etc.

Los componentes de la aplicación de microservicio se pueden escalar de forma independiente sin gravar todo el software. Entonces, si está buscando una solución escalable, los microservicios son su diseño de referencia. La alta escalabilidad del software es solo una de las muchas ventajas que puede obtener de esta arquitectura. Para obtener más información, consulte nuestro artículo sobre los beneficios de los microservicios.

Consejo n.º 8: Supervise el rendimiento para determinar cuándo escalar

Después de la implementación, puede monitorear su software para detectar los primeros signos de degradación del rendimiento que se pueden resolver escalando. Esto le da la oportunidad de reaccionar antes de que el problema se intensifique. Por ejemplo, cuando observa que la memoria se está agotando o que los mensajes están esperando para ser procesados ​​por más tiempo que el límite especificado, esto es una indicación de que su software está funcionando a su máxima capacidad.

Para poder identificar estos y otros problemas relacionados con la escalabilidad del software, debe integrar un sistema de monitoreo de telemetría en su aplicación durante la fase de codificación. Este sistema le permitirá rastrear:

  • Tiempo promedio de respuesta
  • Rendimiento, que es el número de solicitudes procesadas en un momento dado
  • El número de usuarios simultáneos
  • Métricas de rendimiento de la base de datos, como el tiempo de respuesta de la consulta
  • Utilización de recursos, como CPU, uso de memoria, GPU
  • Tasas de error
  • Costo por usuario

Puede beneficiarse de las soluciones de monitoreo existentes y los marcos de agregación de registros, como Splunk. Si su software se ejecuta en la nube, puede usar la solución del proveedor de la nube. Por ejemplo, Amazon ofrece AWS CloudWatch para este fin.

Ejemplos de soluciones de software escalables de la cartera de ITRex

Espejo de fitness inteligente con entrenador personal

Descripción del Proyecto

El cliente quería construir un espejo de fitness de pared de cuerpo entero que ayudara a los usuarios con su rutina de ejercicios. Podría monitorear la forma del usuario durante el ejercicio, contar las repeticiones y más. Se suponía que este sistema incluiría un software que permite a los entrenadores crear y cargar videos, y a los usuarios grabar y administrar sus entrenamientos.

Qué hicimos para garantizar la escalabilidad del software

  • Apostamos por la arquitectura de microservicios
  • Escalabilidad horizontal implementada para distribución de carga. Se agregaba un nuevo nodo cada vez que había demasiada carga en los existentes. Por lo tanto, cada vez que el uso de la CPU excediera el 90 % de su capacidad y se mantuviera allí durante un período de tiempo específico, se agregaría un nuevo nodo para aliviar la carga.
  • Tuvimos que implementar bases de datos relacionales, es decir, SQL y PostgreSQL, por razones arquitectónicas. Aunque las bases de datos relacionales son más difíciles de escalar, todavía hay varias opciones. Al principio, como la base de usuarios aún era relativamente pequeña, optamos por escalar verticalmente. Si la audiencia crecía, planeábamos implementar el enfoque maestro-esclavo: distribuir los datos en varias bases de datos.
  • Se benefició ampliamente del almacenamiento en caché, ya que este sistema contiene mucha información estática, como los nombres de los entrenadores, los títulos de los entrenamientos, etc.
  • Usó RestAPI para el procesamiento de solicitudes asincrónicas entre la aplicación de entrenamiento y el servidor
  • Se basó en una arquitectura sin servidor, como AWS Lambda, para otros tipos de procesamiento asíncrono. Un ejemplo es el procesamiento de video asíncrono. Después de que un entrenador carga un nuevo video de entrenamiento y lo segmenta en diferentes ejercicios, presiona "guardar" y el servidor comienza a procesar este video para transmisión en vivo HTTP para construir cuatro versiones del video original con diferentes resoluciones. El entrenador puede subir nuevos videos simultáneamente.
  • En otro ejemplo, el sistema realiza de forma asíncrona un recorte inteligente en los videos de los usuarios para eliminar cualquier parte en la que el usuario haya estado inactivo.

Sistema de ciberseguridad basado en biometría

Descripción del Proyecto

El cliente quería crear una plataforma de ciberseguridad que permitiera a las empresas autenticar a los empleados, contratistas y otros usuarios en función de la biometría y evitar las contraseñas y los PIN. Esta plataforma también contendría una herramienta de video en vivo para confirmar de forma remota la identidad del usuario.

Cómo nos aseguramos de que este software fuera escalable

  • Usamos una arquitectura de microservicios descentralizada
  • Implementó tres balanceadores de carga para distribuir la carga entre diferentes microservicios
  • Algunas partes de esta plataforma eran autoescalables por diseño. Si la carga superaba cierto umbral, se creaba automáticamente una nueva instancia de un microservicio
  • Utilizamos seis bases de datos diferentes: cuatro PostgreSQL y dos MongoDB. Las bases de datos de PostgreSQL se escalaron verticalmente cuando fue necesario. Mientras diseñábamos la arquitectura, nos dimos cuenta de que algunas de las bases de datos tendrían que escalarse con bastante frecuencia, por lo que adoptamos MongoDB para ese propósito, ya que son más fáciles de escalar horizontalmente.
  • Procesamiento asíncrono implementado para una mejor experiencia de usuario. Por ejemplo, el posprocesamiento de video se realizó de forma asíncrona.
  • Optamos por el algoritmo de reconocimiento facial de un proveedor de servicios externo. Entonces, nos aseguramos de seleccionar una solución que ya fuera escalable y la incorporamos a nuestra plataforma a través de una API.

Desafíos que puede encontrar al escalar

Si tiene la intención de planificar la escalabilidad del software durante el desarrollo de la aplicación y desea incorporar los consejos anteriores, aún puede enfrentar los siguientes desafíos:

  • Deuda técnica acumulada . Las partes interesadas del proyecto aún podrían intentar dejar de lado la escalabilidad en favor de menores costos, velocidad, etc. La escalabilidad no es un requisito funcional y puede verse eclipsada por características más tangibles. Como resultado, la aplicación acumulará características técnicas que no serán compatibles con la escalabilidad.
  • Escalado con metodología de desarrollo Agile . La metodología ágil tiene que ver con aceptar el cambio. Sin embargo, cuando el cliente quiere implementar demasiados cambios con demasiada frecuencia, la escalabilidad del software puede dejarse de lado para adaptarse a las demandas cambiantes.
  • Pruebas de escalabilidad . Es difícil realizar pruebas de carga realistas. Digamos que desea probar cómo se comportará el sistema si aumenta el tamaño de la base de datos 10 veces. Deberá generar una gran cantidad de datos realistas, que coincidan con las características de sus datos originales, y luego generar una carga de trabajo realista tanto para escritura como para lectura.
  • Escalabilidad de servicios de terceros . Asegúrese de que su proveedor de servicios externo no limite la escalabilidad. Al seleccionar un proveedor de tecnología, verifique que pueda admitir el nivel deseado de escalabilidad de software e integre su solución correctamente.
  • Comprender el uso de su aplicación . Debe tener una visión sólida de cómo funcionará su software y cuántas personas lo usarán, lo que rara vez es posible estimar con precisión.
  • Restricciones arquitectónicas . A veces estás limitado en tus elecciones arquitectónicas. Por ejemplo, es posible que necesite usar una base de datos relacional y tendrá que escalarla tanto horizontal como verticalmente.
  • Tener el talento adecuado . Para diseñar una solución escalable que no le cause dolores de cabeza en el futuro, necesita un arquitecto experimentado que haya trabajado antes en proyectos similares y que comprenda la escalabilidad del software desde la perspectiva de la codificación y la infraestructura. Aquí en ITRex Group, hemos trabajado en muchos proyectos y siempre tenemos en cuenta la escalabilidad durante el desarrollo de software.

Para resumir

A menos que esté absolutamente seguro de que no necesitará escalar, considere la escalabilidad del software en las primeras etapas de desarrollo y tome las precauciones necesarias. Incluso si sus opciones arquitectónicas son limitadas y no siempre puede implementar la opción más escalable, aún sabrá dónde están los obstáculos y tendrá tiempo para considerar alternativas.

Dejar la escalabilidad fuera por el bien de otros requisitos funcionales resultará contraproducente. En primer lugar, la empresa tendrá problemas con la degradación del rendimiento. Llevará demasiado tiempo procesar las solicitudes. Los usuarios experimentarán retrasos inaceptables. Después de todo esto, la compañía escalará pagando el doble y el triple de lo que podría haberse gastado en etapas anteriores.

¿Está considerando implementar un nuevo software empresarial o actualizar un sistema existente, pero le preocupa que no se mantenga al día con las necesidades comerciales en rápida expansión? ¡Ponerse en contacto! Nos aseguraremos de que su software no solo tenga todas las funciones necesarias, sino que también se pueda escalar con una inversión y un tiempo de inactividad mínimos.


Publicado originalmente en https://itrexgroup.com el 24 de julio de 2023.