1.0 Introducción: Las leyes ineludibles de la distribución#
La versión 1.0 de esta serie sentó las bases, definiendo las funciones, las herramientas y los patrones arquitectónicos iniciales de la ingeniería backend. Exploramos monolitos y microservicios, SQL y NoSQL, REST y GraphQL. Ese conocimiento representa la base necesaria para crear aplicaciones funcionales. Este volumen, sin embargo, trata sobre lo que sucede cuando escalamos esas aplicaciones; cuando nuestro único servidor se convierte en una flota, nuestra única base de datos se convierte en un clúster y nuestras llamadas en proceso se convierten en saltos de red. Este es el ámbito de los sistemas distribuidos y se rige por un conjunto de reglas diferente y más estricto.
La transición de un sistema monomáquina a uno distribuido no es un aumento lineal de la complejidad; es un cambio de paradigma. Supuestos que son válidos en una sola máquina; redes confiables, latencia cero, operaciones instantáneas; están destrozados. El objetivo principal del ingeniero backend avanzado es construir sistemas que puedan funcionar de manera correcta y confiable a pesar de la falta de confiabilidad inherente del entorno subyacente.
1.1 Las ocho falacias de la informática distribuida#
En la década de 1990, L. Peter Deutsch y otros de Sun Microsystems compilaron una lista de falacias; suposiciones que los programadores nuevos en aplicaciones distribuidas invariablemente hacen, bajo su propio riesgo.
CAUTION
{title=“Eight Fallacies of Distributed Computing”}
La red es confiable. (No lo es).
La latencia es cero. (No lo es).
El ancho de banda es infinito. (No lo es).
La red es segura. (No lo es).
La topología no cambia. (Lo hace.)
Hay un administrador. (Hay muchos).
El costo de transporte es cero. (No lo es.)
La red es homogénea. (No lo es.)
:::Cada patrón, protocolo y arquitectura analizados en este volumen es, de alguna manera, una estrategia para mitigar las consecuencias de estas falacias.
1.2 Una hoja de ruta para la ingeniería backend avanzada#
Sobre la base de nuestra base, exploramos los temas avanzados que definen la arquitectura de sistemas modernos:
Sección 2: Gestión avanzada de datos y coherencia
Sección 3: Patrones de diseño de sistemas resilientes
Sección 4: Comunicación asincrónica avanzada
Sección 5: Ingeniería del rendimiento a escala
Sección 6: API avanzadas y arquitecturas de seguridad
En una aplicación de servidor único con una base de datos, la coherencia de los datos se resuelve en gran medida mediante transacciones ACID. En un sistema distribuido, la coherencia se convierte en uno de los desafíos más difíciles.
2.1 El espectro de consistencia y el teorema PACELC#
El teorema CAP describe el comportamiento durante las particiones de la red, pero el teorema PACELC proporciona una imagen más completa:
NOTE
{title=“PACELC Theorem”}
“Si hay una Partición (P), un sistema distribuido debe elegir entre Disponibilidad (A) y Consistencia (C). De lo contrario (E), cuando el sistema se ejecuta normalmente, debe elegir entre Latencia (L) y Consistencia (C).”
:::Esto obliga a una discusión arquitectónica matizada. Un sistema podría sacrificar la coherencia por la disponibilidad durante las fallas, pero priorizar la coherencia sobre la latencia durante el funcionamiento normal.
El compromiso en dos fases es sincrónico y no es adecuado para microservicios. Saga Pattern gestiona la coherencia de los datos entre servicios a través de transacciones locales y acciones de compensación.
TIP
{title=“Saga Pattern Example: E-commerce Order”}
Servicio de pedidos: crea un pedido en estado PENDIENTE, publica el evento ORDER_CREADO
“Servicio de pago”: procesa el pago, publica “PAYMENT_PROCESSED” en caso de éxito
“Servicio de inventario”: actualiza el stock, publica “INVENTARIO_ACTUALIZADO” en caso de éxito
Servicio de pedidos: Actualiza el pedido a CONFIRMADO
Manejo de fallas: Si el inventario falla, el Servicio de pago compensa con un reembolso, el Servicio de pedidos se cancela.
:::Estilos de implementación:
NOTE
{title=“Saga Implementation Approaches”}
Coreografía: Servicios de publicación/suscripción a eventos sin coordinador central.
Orquestación: El orquestador central gestiona el estado de la saga y las transacciones de compensación.
La resiliencia es la capacidad de recuperarse de fallas y continuar funcionando; manejar las fallas con elegancia en lugar de prevenirlas por completo.
Aísle los componentes de la aplicación en grupos para evitar que fallas individuales afecten a todo el sistema.
TIP
{title=“Bulkhead Implementation”}
Utilice grupos de subprocesos/conexiones separados para cada servicio descendente. Un Servicio A lento no afectará el grupo del Servicio B, lo que evitará una falla total del sistema.
Disciplina sistemática de identificación y eliminación de cuellos de botella.
5.1 Patrones de almacenamiento en caché (en profundidad)#
Estrategias de almacenamiento en caché avanzadas más allá del almacenamiento en caché básico.
NOTE
{title=“Caching Pattern Comparison”}
Aparte del caché: El código de la aplicación administra el caché y la carga diferida
Lectura directa: La caché maneja la carga de datos desde la base de datos.
Escritura directa: Las actualizaciones de caché actualizan la base de datos de forma sincrónica
Reescritura: Las actualizaciones de caché se descargan de forma asincrónica en la base de datos
:::Mitigación del rebaño atronador:
CAUTION
{title=“Thundering Herd Problem”}
Cuando el elemento almacenado en caché caduca, miles de solicitudes simultáneamente pierden el caché y abruman la base de datos. Solución: recuperación basada en bloqueos donde solo la primera solicitud carga datos mientras otras esperan.
La versión 2.0 ha viajado a la ingeniería de sistemas distribuidos. La creación de sistemas backend resilientes y escalables requiere una comprensión profunda de las compensaciones fundamentales: latencia versus coherencia, disponibilidad versus corrección, velocidad versus seguridad.
El ingeniero de backend avanzado diseña para fallas, asume la hostilidad de la red y aplica patrones como Sagas, Event Sourcing, Circuit Breakers y Service Meshes. La habilidad suprema es razonar sobre la complejidad; identificar puntos de falla, cuellos de botella y vulnerabilidades para aplicar estrategias de mitigación apropiadas.
Ingeniería backend avanzada: desde sistemas distribuidos hasta arquitecturas resilientes