¿Cuáles son algunos patrones comunes de arquitectura de servidor para aplicaciones altamente escalables?

La elección de la arquitectura del lado del servidor depende del contexto y el propósito con el que vivirá … Hay dos arquitecturas principales a considerar al diseñar la infraestructura del lado del servidor:

Monolito [1]

Una arquitectura de aplicación monolítica es la arquitectura más tradicional para aplicaciones web. Todas las funciones necesarias solicitadas por el cliente se realizan desde dentro de la pila ; un término acuñado para ilustrar esta arquitectura que se ha adaptado para describir todas las tecnologías utilizadas dentro de un sistema.

Pros:

  • Simple de desarrollar, probar e implementar

Contras:

  • Difícil de escalar
  • Vulnerable a la deuda técnica debilitante [2]
  • Bloqueo de decisiones tecnológicas tempranas (por ejemplo, elección de idioma, patrones de código, etc.)

Microservicio [3] (SOA contemporáneo)

La arquitectura de microservicios se refiere a un patrón de diseño en el que las funciones que tradicionalmente realiza un servidor “monolítico” se desarrollan en “servicios” independientes que se comunican entre sí a través de protocolos web / API. Luego, los servicios se conectan en red, dependiendo el uno del otro para responder las llamadas de los demás para cumplir con la solicitud del cliente.

Pros:

  • Flexibilidad; los servicios se pueden reemplazar por cualquier motivo (delegación a un servicio de terceros, elección de idioma, refactorización, etc.).
  • Resistencia; Los servicios pueden trabajar juntos para equilibrar la carga de manera más efectiva en todo el sistema.

Contras:

  • Complejidad; Sin duda, se introducirán nuevos errores debido a la complexy implicación con los sistemas distribuidos [4].
  • Gastos generales adicionales; cada servidor en el que reside el servicio deberá gestionarse de forma independiente.

Arquitectura “sin servidor”; una opción alternativa

Con la proliferación de Anything-as-a-Service, es completamente posible desarrollar aplicaciones web exitosas utilizando nada más que servicios de terceros disponibles en la actualidad. Servicios como Amazon Lambda y Google Cloud Functions le permiten escribir las funciones que necesita, sin la molestia de administrar uno o más servidores en el proceso. El único servicio adicional para mantener es el que sirve al cliente al dispositivo de los usuarios, si es necesario.

Pros:

  • El camino más rápido para el despliegue
  • Soporte (por ejemplo, soporte al cliente, documentación, etc.)
  • Escalabilidad; si puede pagarlo, casi puede garantizar la disponibilidad

Contras:

  • Costo; estas sutilezas tendrán un precio
  • Cerrar; a menos que esté correctamente diseñado, cambiar de estos servicios puede convertirse en un gasto.

Notas al pie

[1] Patrón de arquitectura monolítica

[2] Deuda técnica

[3] Patrón de arquitectura de microservicios

[4] Notas sobre sistemas distribuidos para sangre joven

No existe una solución única para mejorar la escalabilidad y el rendimiento. Dicho esto, hay una serie de patrones que ocurren con frecuencia:

  • Divide y vencerás : divide un problema en muchos problemas más pequeños y resuelve los problemas en muchas CPU o servidores para que cada uno tenga que hacer menos trabajo. Ejemplos: múltiples servidores web, replicar o fragmentar una base de datos, MapReduce.
  • Almacenamiento en caché : haga el trabajo con anticipación y guarde los resultados, de modo que en lugar de calcularlos a pedido, solo recupere los valores calculados previamente del almacenamiento. Ejemplos: cachés de bases de datos, esquemas desnormalizados, cachés distribuidos, CDN, cookies, memorización, algoritmos de programación dinámica.
  • Pereza : Evite hacer el trabajo posponiéndolo hasta que sea absolutamente necesario. Ejemplos: partes de carga lenta de una página web solo cuando se desplaza a ella, bloqueo optimista en una base de datos.
  • Corrección aproximada : en muchos casos, se necesita menos trabajo para obtener una respuesta que sea “lo suficientemente cercana” como para obtener una que sea exactamente correcta. Ejemplos: consistencia eventual, HyperLogLog, garantías de durabilidad reducida, mensajes de mejor esfuerzo.
  • Asincronía : en lugar de bloquear o bloquear mientras espera el resultado de un cálculo, continúe trabajando y haga que el cálculo le notifique cuando haya terminado. Ejemplos: E / S sin bloqueo, bucles de eventos, estructuras de datos sin bloqueo.
  • Jitter y aleatorización : evite picos y puntos calientes tratando de distribuir la carga de manera uniforme. Ejemplos: aleatorización de fechas de caducidad de caché, algoritmos de equilibrio de carga (round robin, programación de prioridad), algoritmos para la partición de claves (por ejemplo, partición de rango, partición de hash).
  • Aceleración : rechace ciertos cálculos para que no ralenticen otros. Ejemplos: solicitudes de limitación de velocidad en un servidor o eliminación de servidores lentos de la ruta de solicitud.
  • Redundancia : inicie el mismo cálculo más de una vez y devuelva el que termine más rápido. Ejemplos: solicitudes de respaldo o cubiertas en sistemas distribuidos, servidores redundantes en caso de falla (por ejemplo, espera activa para una base de datos).
  • Co-ubicación : acerque las cosas físicamente para reducir la latencia. Ejemplos: CDN, múltiples centros de datos en todo el mundo, colocando servidores relacionados en el mismo rack de servidores.
  • Hardware más rápido : escala vertical AKA. Ejemplos: CPU más rápida, más RAM, más caché de CPU, discos duros de estado sólido, redes más rápidas, realizar cálculos en RAM en lugar de en disco o en el caché de CPU en lugar de en RAM.
  • Algoritmos más rápidos : encuentre un algoritmo que le permita hacer menos trabajo. Ejemplos: búsqueda binaria en lugar de búsqueda lineal, ordenación rápida en vez de burbuja.

(La lista anterior se copia del Capítulo 7, Escalabilidad, de mi libro Hello, Startup: A Programmer’s Guide to Building Products, Technologies, and Teams )

La escalabilidad es un gran tema. Estos son algunos de mis recursos favoritos para aprender más:

  • La aplicación de los doce factores
  • Una guía completa para crear una aplicación web escalable en Amazon Web Services
  • Recursos de inicio: escalabilidad
  • Principios de los programas de alto rendimiento.
  • Diseño de aplicaciones intensivas en datos
  • Números que todo programador debe saber
  • Hola, Startup: una guía del programador para crear productos, tecnologías y equipos

La creación de varios servicios simples y distribuidos es fácilmente escalable. Estos podrían distribuirse de forma independiente o agruparse como una unidad de mantenimiento / aprovisionamiento.

Por distribuido, me refiero a los servicios que pueden comunicarse a través de la red, ya sea utilizando el bus de servicio empresarial o un protocolo confiable. Cuanto menor es la latencia, más rápidos son los tiempos de respuesta.

Por simple, quiero decir, servicio con responsabilidad única / simple / no conflictiva.

La elección del idioma no siempre puede afectar la escalabilidad a menos que la aplicación sea de misión crítica.

La elección de la base de datos subyacente afecta en gran medida el rendimiento. SQL o NoSQL o almacenes en memoria, haga una elección correcta en función del uso principal de la aplicación de datos almacenados y el teorema CAP.

Hay algunos MVC (Model View Controller), MVP (Model View Presenter), MVVM (Model-view-viewModel), SOA (Service Oriented Architecture), MicroServices