Siete Cuellos de Botella que no dejan Escalar tu Aplicación

La escalabilidad significa la capacidad del sistema de procesar cargas de trabajo que se van incrementando mientras se mantiene la misma latencia, es decir que tenga el mismo tiempo de respuesta.

Por ejemplo, si tu sistema toma X segundos para responder a la solicitud de un usuario, debe tomar la misma cantidad de tiempo para responder a cada una de las solicitudes de millones de usuarios concurrentes.

Para una aplicación web, hay siete errores comunes que pueden llegar a ser un cuello de botella y puede dañar la escalabilidad.

1. Código de mala calidad

El código ineficiente y poco estructurado tiene el potencial de ralentizar el servicio en producción.

Específicamente código escrito:

- Altamente cohesionado (el famoso Spaghetti)

- Con bucles innecesarios o bucles anidados.

- Con algoritmos ineficientes o demasiado elaborados.

2. Eligiendo un tipo equivocado de base de datos

Elegir la base de datos equivocada puede ser mortal. Cada tecnología de base de datos tiene sus ventajas y desventajas.

Si la idea es utilizar una base de datos relacional, basada en SQL, tendremos las ventajas de:

Transacciones

Fuerte consistencia

Si la alternativa es una base de datos No-SQL:

No hay requerimientos de que la consistencia sea fuerte

Escalabilidad horizontal

Adicionalmente, también necesitamos asegurar que la base de datos misma sea escalable. La base de datos escalable elegida debe ser posible de particionar, fragmentar y desplegar a múltiples servidores de bases de datos rápidamente.

3. Embebiendo lógica de negocios en la base de datos

La base de datos no es lugar para colocar lógica de negocios en la mayor parte de situaciones, como el cálculo o la validación.

Agregar esta lógica provocará que sea más difícil actualizar la base de datos o la aplicación por separado. También, está agregando carga de trabajo a la base de datos, para lo cual no está optimizada.

Tener este sistema altamente acoplado podría hacer que refactorizar la base de datos o migrar una pesadilla.

4. No hay caché suficiente

En general, la caché debería interceptar la mayoría de las solicitudes de base de datos.

Con la lógica de desalojo adecuada, la implementación de caché en todas las capas de aplicación necesarias aumentará drásticamente el tiempo de respuesta.

5. Configuración de balanceador de carga

Dependiendo del volumen de tráfico y número de servidores, necesitamos ajustar el número de balanceadores de carga tanto como el sistema escala.

El balanceador de carga funciona como una puerta a nuestra aplicación. Tener la cantidad correcta de balanceadores de carga es crucial para la latencia de un sistema.

6. API equivocada

La eficiencia de la API también dicta la latencia tanto como el tráfico incrementa. Para las aplicaciones web, aquí están las ventajas y contras de las API más comunes:

#1 REST API:

Fácil de implementar y descubrir

Respuestas complejas

#2 GraphQL:

Consulta flexible

Tiempo adicional de configuración en el cliente y el servidor

#3 RPC(gRPC) con buffer de protocolo:

Mejor desempeño con datos binarios codificados y comprimidos.

Requiere soporte de cliente y servidor al esquema de datos.

7. Síncrono versus Asíncrono

Mientras el sistema va escalando, manejar tareas síncronas y asíncronas con diferentes lógicas podrían reducir la complejidad y latencia del sistema.

Por ejemplo, para manejar tareas como "procesar datos de inicio de sesión de usuarios" o "enviar notificaciones" las cuales pueden ser realizadas asíncronamente, podríamos utilizar frameworks asíncronos basados en mensajes (como Kafka). Su modelo suscriptores/publicador es ideal para manejar esos tipos de trabajo.

Resumen

Diagnosticar un cuello de botella del sistema puede ser retador. Equipate a ti mismo con herramientas adecuadas y el conocimiento de errores típicos podrían hacer de ese proceso algo más manejable.

Comentarios