Sistemas distribuidos

Sistemas distribuidos

Uno de los mayores retos al que nos enfrentamos los desarrolladores cuando construimos aplicaciones en la nube es que nuestra aplicaciones deben conectarse con otros servicios que no están en la misma máquina en la que se ejecutan nuestras apps. Esos servicios pueden estar en nuestra red privada, en una red pública, a pocos kilómetros o muy lejos. Sin darnos cuenta, hemos entrado en el mundo de los sistemas distribuidos.

Qué es un sistema distribuido

Un sistema distribuido es un sistema en el que las máquinas individuales están conectadas a través de una red pero aparecen como una sóla máquina. Ser capaz de distribuir la potencia de cómputo de un grupo de máquinas es la mejor manera de lograr la escalabilidad, la fiabilidad y ahorrar costes. Por ejemplo, la mayoría de los proveedores de nubes (Microsoft Azure, Google Cloud Platform, Digital Ocean, Amazon Web Services...) están utilizando máquinas sencillas para solucionar problemas complejos como la alta disponibilidad y fiabilidad a través de soluciones basadas en software.

Características de los sistemas distribuidos

Las características por las que se caracteriza un sistema distribuido son las siguientes:

  • Compartir recursos
    Poder acceder a los recursos del sistema distribuido y/o que se pueda acceder a ellos a distancia a través de varias máquinas del sistema. Los servicios de los sistemas distribuidos comparten recursos como el hardware (discos e impresoras), el software (archivos y objetos de datos) y los datos.
  1. Los recursos de hardware se comparten para reducir el coste y por la conveniencia.
  2. Los datos se comparten para lograr coherencia e intercambio de información.
  3. Los recursos son administrados por un módulo de software conocido como administrador de recursos. Cada recurso tiene sus propias políticas y métodos de gestión.
  • Heterogeneidad
    Los componentes pueden utilizar diferentes redes, hardware, sistemas operativos, lenguajes de programación e implementaciones de diferentes desarrolladores.

  • Apertura
    La apertura se refiere a las ampliaciones y mejoras de los sistemas distribuidos. El sistema distribuido debe ser abierto en términos de hardware y software. Para que un sistema distribuido sea abierto, debe publicar una interfaz detallada y bien definida de los componentes, además de seguir los estándares correspondientes. De este forma el componente será fácilmente integrable con otros componentes.

  • Concurrencia
    La concurrencia es una propiedad de un sistema que representa el hecho de que se ejecuten múltiples procesos al mismo tiempo. La ejecución simultánea de tareas tiene lugar en diferentes componentes que se ejecutan en múltiples máquinas como parte de un sistema distribuido. Además, estas actividades pueden realizar algún tipo de interacción entre ellas. La concurrencia reduce la latencia y aumenta el rendimiento del sistema distribuido.

  • Escalabilidad
    La escalabilidad se refiere principalmente a la forma en que el sistema distribuido maneja el crecimiento a medida que aumenta el número de usuarios del sistema. La mayoría de las veces escalamos el sistema distribuido añadiendo más máquinas en la red(escalado horizontal). No debería ser necesario cambiar los componentes cuando escalamos el sistema.

  • Tolerancia a fallos
    En un sistema distribuido, el hardware, el software, la red, cualquier cosa puede fallar. El sistema debe ser diseñado de tal manera que esté disponible todo el tiempo incluso después de que algo haya fallado.

  • Transparencia
    Los sistemas distribuidos deben ser percibidos por los usuarios y los programadores de aplicaciones como un todo, y no como un conjunto de componentes que cooperan entre sí.

Libros de sistemas distribuidos

Estos son algunos de los libros más recomendados para profundizar en esta materia

Sistemas distribuidos: Conceptos y diseños

George Coulouris, Jean Dollimore, Tim Kindberg

Sistemas distribuidos: Principios y paradigmas

Marteen Tanenbaum, Andrew S./Van Steen

Sistemas distribuidos: Arquitectura y aplicaciones

Luis Miguel Jiménez, Rafael Puerto, Luis Payá

Designing distributed systems: Patterns and paradigms for scalable reliable services

Brendan Burns