Crear un backend escalable desde cero puede ser muy difícil.
Con el enfoque correcto, puedes crear algo listo para crecer a medida que lo hace tu aplicación.
Hoy cubriremos siete pasos prácticos para ayudarlo a escalar su backend y cómo Encore (como marco de backend) ayuda en algunos de ellos.
Vamos a saltar allí.
🎯 ¿Qué significa escalar el backend?
Antes de comenzar con los puntos, es importante entender el concepto general.
Es necesario escalar un backend para garantizar que la aplicación funcione bien a medida que aumenta el tráfico, los usuarios o los datos. Por ejemplo, piense en una aplicación de redes sociales que maneja millones de cargas de fotos diarias o en un sitio web de comercio electrónico que gestiona ventas con miles de pedidos por segundo (como Amazon).
Hay dos enfoques principales para ello:
✅ escalamiento vertical (agregar más recursos a un solo servidor)
✅ escalamiento horizontal (distribuir la carga entre múltiples servidores).
Puedes ver este vídeo si quieres saber la diferencia entre escala horizontal y escala vertical.
¿Mi sugerencia?Si recién estás empezando, no lo pienses demasiado.
Creo que es algo de lo que hay que preocuparse cuando se está seguro de que se va a necesitar una mejor infraestructura. Hasta entonces, se puede confiar en lo habitual; muchas aplicaciones ni siquiera necesitan una ingeniería excesiva como esa.
Dicho esto, aprendamos más sobre ello.
1. Construir la base adecuada con la arquitectura correcta.
Piense en su backend como si fuera el plano de un edificio. Una mala base provocará problemas a medida que agregue más peso (o usuarios). Veamos los dos tipos principales de arquitectura que puede utilizar.
🎯¿Qué es la Arquitectura Monolítica?
La arquitectura monolítica significa que todo está construido como una gran aplicación. Es más fácil al principio, pero puede volverse complicado a medida que creces. Todas las partes de tu aplicación dependen unas de otras, por lo que si una parte falla, toda la aplicación puede verse afectada.
Muchas bases de código populares comenzaron con esto, como las primeras versiones de Instagram. Esta arquitectura funciona para aplicaciones más pequeñas, pero puede volverse confusa a medida que se escala.
Para ser honesto, todavía se puede diseñar de forma modular para abordar la mayoría de las desventajas.

🎯 ¿Qué es la arquitectura de microservicios?
La arquitectura de microservicios divide la aplicación en servicios más pequeños e independientes que se comunican a través de API. Este enfoque es más escalable y flexible porque se puede actualizar o escalar cada servicio de forma independiente sin afectar a todo el sistema.
Netflix, Amazon y muchos otros utilizan esto, donde diferentes partes de la aplicación (como autenticación de usuario, pagos, recomendaciones) son manejadas por servicios separados.
Esto puede resultar tedioso y complejo, por lo que sólo se recomienda para grandes empresas.

También deberías leer 5 puntos críticos comunes de los microservicios y cómo abordarlos.
Si está interesado en una guía comparativa, consulte este blog sobre Microservicios vs Monolito de Atlassian.
Encore es un marco de backend de código abierto y admite la arquitectura de microservicios. Está diseñado para brindarles a los equipos las herramientas que necesitan para crear microservicios desde el primer día.
También proporciona una herramienta visual conocida como Flowque le brinda una vista siempre actualizada de todo su sistema, ayudándolo a razonar sobre su arquitectura de microservicios e identificar qué servicios dependen unos de otros y cómo funcionan juntos.
✅ Localice cuellos de botella antes de que se conviertan en grandes problemas.
✅ Revele instantáneamente la naturaleza y la escala de sus dependencias.
✅ Actualización automática en tiempo real para reflejar su arquitectura a medida que realiza cambios en el código.GIF
2. Haga que su aplicación no tenga estado para lograr un verdadero escalamiento horizontal.
La falta de estado significa que cada servidor no necesita recordar las sesiones de los usuarios. Es como no depender de un cajero para completar tus compras, sino que cualquier cajero puede ayudarte.
Este enfoque facilita agregar o eliminar servidores sin interrumpir la aplicación existente y no dependen unos de otros para funcionar.
Es más útil para aplicaciones que esperan picos de tráfico, como Spotify durante estrenos musicales o sitios de comercio electrónico (como Amazon) durante eventos de ventas.
🎯 ¿Cómo implementar la apatridia?
Para lograrlo, es necesario delegar la gestión de sesiones. Puedes utilizar:
JWT (JSON Web Tokens):una forma sencilla de pasar datos de usuario entre solicitudes sin almacenarlos en el servidor.Redis: para la gestión de sesiones, como el almacenamiento de datos de sesiones temporales en la memoria y el almacenamiento en caché de datos a los que se accede con frecuencia, para minimizar las llamadas a la base de datos y, por lo tanto, mejorar el rendimiento. También puede utilizar Memcached en lugar de Redis.
Por ejemplo, Netflixutiliza ampliamente diseños sin estado para las sesiones de usuario, lo que conduce a una transmisión fluida independientemente de las cargas del servidor.
Además REST APIs, por diseño, suelen ser apátridas, por lo que son ideales para escalar.

3 Distribución inteligente del tráfico que puede salvar el día.
En esta sección, abordaremos el tema del equilibrio de carga. Es el proceso de distribuir las solicitudes entrantes de manera uniforme entre varios servidores para garantizar que ningún servidor se vea sobrecargado, lo que de lo contrario puede provocar ralentizaciones o fallas.
Mejora la disponibilidad, la tolerancia a fallos y muchas cosas, incluida la escalabilidad.

Existen diferentes algoritmos, cada uno de los cuales se centra en un patrón de tráfico único:
⚡ Round Robin: asigna solicitudes de forma secuencial a cada servidor en un bucle. Es simple, pero puede resultar complicado con cargas desiguales.
⚡ Least connections: dirige el tráfico al servidor con menos conexiones activas.
⚡ Weighted Round Robin: los pesos se asignan a cada servidor en función de la capacidad, lo que permite que los servidores con pesos más altos manejen más tráfico
⚡ IP Hash: El algoritmo de equilibrio de carga de hash de IP le permite utilizar el valor hash de la dirección IP del cliente para decidir qué servidor cumple la solicitud.
Hay un artículo interesante de Equinix que explica cómo funcionan los algoritmos de equilibrio de carga con diagramas visuales.
🎯 ¿Herramientas para implementar balanceadores de carga?
A continuación se muestran algunas de las herramientas más utilizadas para implementar esto:
NGINX:Servidor web de código abierto y proxy inverso, muy flexible en el manejo del equilibrio de carga y el almacenamiento en caché.AWS ELB:balanceador de carga administrado en la nube que distribuye automáticamente el tráfico entrante entre instancias y escala según la demanda.HAProxy:balanceador de carga de código abierto liviano y altamente confiable para manejar grandes volúmenes de tráfico con una latencia mínima.
Hay más herramientas (además de estas) que puedes encontrar en blogs en línea.
Consejo:Podrías combinar balanceadores de carga con redes de distribución de contenido (CDN) como Cloudflare para reducir la carga en los servidores.
4. No dejes que tu base de datos sea el cuello de botella.
Tu base de datos puede convertirse en un problema importante a medida que tu aplicación crece (ya que normalmente nunca está optimizada). Las consultas lentas y los retrasos pueden frustrar a los usuarios y hacer que todo se caiga.
Existen estrategias inteligentes que puedes utilizar para manejar la carga adecuadamente.
🎯 Consejos comunes para que los desarrolladores optimicen su base de datos.
⚡ Indexing: uso de índices en columnas consultadas con frecuencia para búsquedas más rápidas. Por ejemplo, las aplicaciones de comercio electrónico pueden indexar los identificadores de productos para obtener resultados de búsqueda más rápidos.
⚡ Caching: almacenar en la memoria datos a los que se accede con frecuencia, lo que reduce la cantidad de accesos directos a la base de datos. Redis o Memcached pueden resultar útiles en este caso.
⚡ Database sharding: para aplicaciones de gran escala, puedes fragmentar tu base de datos, lo que equivale a dividirla en partes más pequeñas y manejables. Cada parte (conocida como fragmento) se puede distribuir entre varios servidores.
⚡ Database Partitioning: puedes dividir tu base de datos en partes más pequeñas y manejables (como dividir a los clientes por región) para distribuir la carga.
⚡ Connection pooling: Uso de bibliotecas de agrupación para administrar conexiones de bases de datos de manera eficiente sin saturar la base de datos.
Hay muchos más conceptos como la optimización de consultas y la desnormalización, pero no los voy a cubrir todos aquí (de lo contrario, esto sería muy largo).
Si su aplicación crece, se recomienda utilizar bases de datos distribuidas como MongoDB, Amazon Aurora o CockroachDB, que manejan conjuntos de datos y tráfico más grandes de una manera mucho mejor.
Si desea obtener más información, le recomiendo consultar:
- Una guía para comprender los patrones de escalado de bases de datos por freeCodeCamp
- Escalado de bases de datos con MongoDB

5. Monitoreo y registro inteligentes para evitar fallas del backend.
A medida que su aplicación escala, la supervisión y el registro inteligentes pueden ayudarlo a mantenerse al tanto del estado de su backend y detectar problemas antes de que se salgan de control.
Imagina que tu aplicación se vuelve viral de la noche a la mañana, aumenta el tráfico y todo parece ir bien al principio. Luego, los usuarios comienzan a informar errores. Sin una supervisión y registros adecuados, no sabrás qué salió mal.
Obtener información en tiempo real y registros detallados, para poder identificar cuellos de botella y depurar más rápidamente, hará que su trabajo sea mucho más fácil, especialmente durante tráfico inesperado.
🎯 ¿Qué es el Monitoreo?
Las herramientas de monitoreo rastrean el rendimiento de tu aplicación en tiempo real. Te brindan métricas como la carga del servidor (uso de recursos), los tiempos de respuesta y las tasas de error para que puedas detectar tendencias. Puedes usar herramientas como:
Datadog: proporciona visibilidad de toda la pila. Ofrece gestión de registros, supervisión del rendimiento de las aplicaciones (APM) e incluso paneles de control en tiempo real.Prometheus: herramienta de monitoreo de código abierto que recopila métricas de objetivos configurados en intervalos específicos. Además, se integra bien con Grafana para visualizar datos.New Relic:Otra herramienta de monitoreo con información relacionada con los tiempos de transacción, tasas de error y rendimiento de consultas de bases de datos.
Incluso puedes configurar alertas para notificar a tu equipo en el momento en que algo parezca extraño.
🎯 ¿Qué es el registro?
El registro registra cada evento significativo en tu backend, como solicitudes, errores o advertencias. Es como un diario para tu aplicación, que te ayuda a depurar cuando algo falla.
- El registro centralizado mediante herramientas como ELK Stack o AWS CloudWatch facilita la búsqueda y el análisis de registros en todos los servicios.
- El registro estructurado (formato JSON) hace que los registros sean legibles por máquina, lo que hace que el proceso de depuración sea un poco más fácil.
🎯¿Qué es el rastreo?
El rastreo ayuda a rastrear una sola solicitud en varios servicios, lo que permite identificar las partes lentas o defectuosas. Herramientas como Jaeger u OpenTelemetry son excelentes para esto.
Para obtener el máximo rendimiento, puede combinar la supervisión, el registro y el seguimiento. Puede implementar todo esto con Encore.
✅ Encore proporciona seguimiento distribuido para rastrear solicitudes en su aplicación e infraestructura.
A diferencia de la instrumentación intensiva que normalmente necesitaría para utilizar el rastreo,Encore captura automáticamente los rastros de toda su aplicación, en todos los entornosEsto significa, de manera única, que puede utilizar el seguimiento incluso para el desarrollo local, con el fin de ayudar a depurar y acelerar las iteraciones.
Obtendrá acceso a una gran cantidad de información, como seguimientos de pila, registro estructurado, solicitudes HTTP, información de conexión de red, llamadas API, consultas de bases de datos y más.GIF
✅ En la nube de Encore, también obtienes soporte integrado para realizar un seguimiento de métricas clave. También es fácil definir métricas personalizadas para tu aplicación.GIF
✅ Encore ofrece compatibilidad integrada con el registro, que combina un mensaje de registro de formato libre con pares clave-valor estructurados y de tipo seguro. Esto facilita el análisis y la indexación de datos por parte de una computadora.
Sólo tienes que agregarlo en el módulo: import log from "encore.dev/log";.
Luego , puede llamar a cualquiera de las funciones de registro como error, warn, o para emitir un mensaje de registro.infodebugtrace
const logger = log.with({is_subscriber: true})
logger.info("user logged in", {login_method: "oauth"}) // includes is_subscriber=true
También puedes transmitir en vivo tus registros directamente a tu terminal ejecutando: encore logs --env=prod. Lee más en la documentación .
En resumen, Encore ofrece muchas cosas, incluida una forma de visualizar la arquitectura de su microservicios en la nube y obtener automáticamente un catálogo de servicios con documentación API completa.
Si está interesado en aprender más, A Guide to Observability Principles: Significance, Practical Implementations, and Best Practices es un buen lugar para comenzar.
6. Automatizar el aprovisionamiento de infraestructura y DevOps.
Configurar servidores, configurar entornos o implementar código manualmente puede, en ocasiones, ralentizar el proceso a medida que la aplicación escala. La automatización elimina la mayoría de las tareas repetitivas y mejora la coherencia (aunque sea un poco).
🎯 ¿Qué es la automatización de la infraestructura?
La automatización de la infraestructura es como utilizar herramientas para administrar y aprovisionar sus servidores, redes y bases de datos automáticamente, sin intervención manual.
- Herramientas como Terraform o AWS CloudFormation le permiten definir su infraestructura como código (IaC).
- Con IaC, puedes crear entornos idénticos para desarrollo, pruebas y producción con un solo comando.
Pulumi es una de esas herramientas IaC modernas que utiliza lenguajes de programación que ya conoces, como JavaScript o Python.
🎯 ¿Por qué deberías intentar automatizar DevOps?
La automatización de DevOps mejora los procesos de CI/CD, los procesos de implementación y las tareas de monitoreo.
- Herramientas como Jenkins , GitHub Actions o GitLab CI ayudan a realizar implementaciones de código más rápidas y sin errores.
- Las actualizaciones continuas o las implementaciones azul-verde se pueden realizar fácilmente sin tiempo de inactividad.
Por ejemplo, Kubernetes automatiza la orquestación de contenedores al administrar el escalamiento y el equilibrio de carga de su aplicación por sí solo.
Veamos cómo Encore ayuda en este departamento.
Encore le permite definir la infraestructura como objetos de tipo seguro en su aplicación, unificando su infraestructura con el código de su aplicación. Encore puede automatizar el aprovisionamiento de infraestructura y DevOps mediante el análisis del código de la aplicación.
Encore Cloud aprovisiona automáticamente toda la infraestructura necesaria, en todos los entornos y entre todos los principales proveedores de nube, sin necesidad de cambios en el código de la aplicación.

Con Encore, no es necesario definir ninguna especificación del servicio en la nube en el código de la aplicación. Esto significa que, después de la implementación, puede utilizar de forma segura la consola de su proveedor de nube para modificar los recursos aprovisionados o utilizar la interfaz de usuario de configuración integrada en el panel de control de Encore Cloud. Encore Cloud se encarga de sincronizar los cambios automáticamente en ambas direcciones.
Hay muchas otras cosas que se vuelven más fáciles conEncore Cloud, ya que puede automatizar completamente DevOps y la infraestructura en AWS y GCP, reduce el trabajo de DevOps en casi un 90 %.
Si estás interesado en obtener más información, consulta:
- Documentos adicionales para aprender sobre la automatización del aprovisionamiento de infraestructura .
- ¿Qué es la automatización de DevOps? Cómo empezar con LambdaTest
7. Secretos de almacenamiento en caché de los que nadie habla.
El almacenamiento en caché puede ser la parte más importante de la escalabilidad del backend, a menudo pasada por alto, pero capaz de reducir drásticamente los tiempos de respuesta y la carga del servidor.
El secreto está en utilizar el almacenamiento en caché de forma inteligente para las partes de la aplicación que más lo demandan.
🎯 ¿Qué es el almacenamiento en caché?
El almacenamiento en caché se utiliza para almacenar temporalmente datos a los que se accede con frecuencia, de modo que las solicitudes futuras puedan atenderse más rápidamente sin tener que consultar repetidamente la base de datos ni reprocesar la información.
Por ejemplo, pensemos en una aplicación de comercio electrónico como Amazon durante las rebajas del Black Friday. Millones de usuarios buscan ofertas de moda y los productos más vendidos.
En lugar de consultar la base de datos para cada búsqueda, la aplicación puede almacenar en caché los productos más populares y sus detalles durante unos minutos. Esto no solo mejora los tiempos de respuesta para los usuarios, sino que también reduce la carga de la base de datos durante los picos de tráfico.

Técnicas de almacenamiento en caché que debes conocer.
⚡ Application-Level Caching: marcos como Django o Express.js admiten el almacenamiento en caché en memoria para una lógica empresarial específica.
⚡ In-Memory Caching: ideal para datos de sesión, perfiles de usuario o cualquier dato de acceso frecuente que requiera baja latencia. Redis o Memcached son perfectos para esto.
⚡ Content Delivery Networks: servicios como Cloudflare o Akamai almacenan en caché archivos estáticos (por ejemplo, imágenes, CSS, JavaScript) más cerca de la ubicación del usuario. Por ejemplo, Amazon utiliza CDN para cargar imágenes de productos casi instantáneamente.
⚡ Client-side caching: almacenar datos en el dispositivo del cliente como un navegador web, esto puede generar problemas con datos obsoletos, ya que los datos en caché pueden no estar siempre actualizados.
⚡ Distributed caching: permite que varios servidores compartan la carga de trabajo de almacenamiento y recuperación de datos.

Luego también existen estrategias de almacenamiento en caché para mejorar el rendimiento como:
⚡ Cache Aside (lazy loading): primero comprueba si hay datos en la memoria caché. Si no hay datos (error de caché), los recupera de la base de datos y llena la memoria caché para futuras solicitudes. Minimiza el tamaño de la memoria caché y se asegura de que solo se almacenen los datos frecuentes.
⚡ Cache Invalidation: para actualizar datos obsoletos, mediante vencimiento basado en el tiempo o actualizaciones impulsadas por eventos.
⚡ Data Partitioning: particionar su caché según criterios específicos (como ID de usuario o ubicación geográfica).
⚡ Write Through: Cuando se actualizan los datos, se escriben tanto en la memoria caché como en la base de datos al mismo tiempo.
⚡ Write Behind: los datos se escriben primero en la memoria caché y luego en la base de datos. Esto podría generar inconsistencias si la memoria caché no se administra correctamente.
⚡ Adaptive Caching: ajusta dinámicamente las políticas de almacenamiento en caché en función de los patrones de acceso a datos en tiempo real, la carga de tráfico o los recursos utilizados.
⚡ Cache Aggregation: combina varias entradas de caché en una única respuesta consolidada, lo que reduce la sobrecarga de varias búsquedas. Es útil principalmente para API o microservicios.
⚡ Cache Stampede Prevention: Para garantizar que varias solicitudes de los mismos datos no sobrecarguen el backend cuando caduca un caché, técnicas como locking, request collapsingo early recomputationpueden resultar de ayuda.
Hay muchas más estrategias como Content-aware caching, Multi-Level Caching, Cache Warm-Up, y no muchos desarrolladores conocen estos conceptos.
Si te interesa aprender más, hay un artículo muy interesante sobre estrategias de almacenamiento en caché que te brinda tipos de almacenamiento en caché, estrategias, ejemplos de la vida real e incluso muestras de código que utilizan esas técnicas. ¡Muy recomendable!
Hay un blog muy bueno que cubre 9 estrategias de almacenamiento en caché para entrevistas de diseño de sistemas .
Al utilizar el almacenamiento en caché de forma estratégica, puede escalar su backend sin consumir recursos del servidor.


