Grokked por experiencia:
- Embotellamiento
¿Qué parte del sistema consume / retiene la mayoría de los recursos (CPU, memoria, E / S, bloqueos de grano grueso)? El rendimiento de un sistema es tan bueno como el rendimiento del cuello de botella.Soluciones: apatridia (externalizar el estado a capas más distribuidas, por ejemplo, cliente o capa de datos), almacenamiento en caché (antigüedad de datos comerciales por rendimiento), especialización (separación del sistema en servicios / grupos funcionales bastante independientes), fragmentación (división / distribución del trabajo por espacio de datos) , replicación y equilibrio de carga (para distribuir recursos. Las variaciones son replicación maestro-esclavo, 1 escribe N lee la replicación, W escribe R lee la replicación), consistencia eventual (intercambiando consistencia fuerte para alta disponibilidad), concurrencia optimista y estado blando (aislamiento comercial para alta disponibilidad)
- Punto único de fallo
Si muere, todo lo demás muere. Un sistema es tan confiable como su único punto de falla.Soluciones: Replicación (para lograr una mayor disponibilidad), por ejemplo, con el quórum del cuidador del zoológico (generalmente utilizado como autoridad central para coordinar operaciones distribuidas, descubrimiento de nodos, etc.).
- Bajo acoplamiento
(para administrar actualizaciones independientes de diferentes servicios / capas. Un error común es hacer que las cosas estén tan estrechamente tejidas que para actualizar una capa necesitarás derribar toda la aplicación. Parece mágico al principio, como el infierno más tarde. Eso es por qué tratar de evitar marcos estrechamente acoplados )Soluciones: servicización , estratificación , dependencia unidireccional (permite actualizaciones individuales sin interrupción), desacoplamiento a nivel de tiempo de ejecución (por ejemplo, mediante el uso de colas de mensajes. La idempotencia se vuelve importante para tolerar mensajes duplicados o reintentos en general)
- Manejabilidad
(para salvar tu cordura en general)¿Cómo se nombran los nodos / servicios? ¿Cómo se le notifica que los nodos mueren o cobran vida? ¿Cómo agrega o elimina máquinas de un clúster? ¿Cómo se nombran los grupos? ¿Qué servicio es la principal autoridad para la verdad? ¿Cómo sé qué versiones de código ejecuta cada nodo? ¿Cómo se correlaciona lo que sucedió aquí con lo que sucedió allí?
Componentes comunes:
- Remoting (usando TCP / HTTP, varias selecciones de serializaciones)
- Equilibrio de carga (round-robin, aleatorio, sesión fija)
- Cola de mensajes
- Almacenes de datos distribuidos
- Zookeeper
- Sistema de monitoreo (invierta temprano para prevenir el dolor de cabeza más adelante, confíe en mí)
Otras cualidades arquitectónicas que de repente se vuelven importantes con la escala:
- Confiabilidad y tolerancia a fallas: porque el tiempo esperado para fallar se acorta drásticamente a medida que agrega más nodos. Necesidad de construir sistemas que sean inmunes a las fallas de los nodos regulares. Debe prestar más atención a las copias de seguridad periódicas y la replicación en vivo para copias de seguridad a corto plazo.