El estilo arquitectónico Red entre iguales (Peer-to-peer, P2P) es una red de computadoras donde todos los dispositivos conectados a la red actúan como cliente y servidor al mismo tiempo. En esta arquitectura no es necesario un servidor central que administre la red (aunque puede existir), si no que todos los nodos de la red pueden comunicarse entre sí.
La arquitectura P2P es para muchos solo una variante de la arquitectura Cliente-Servidor, sin embargo, tiene una diferencia importante que hace que la podamos clasificar como un estilo arquitectónico independiente, y es que la arquitectura Cliente-Servidor tiene como punto medular la centralización, mientras la arquitectura P2P busca la descentralización.
La arquitectura P2P es como si uniéramos el Cliente y el Servidor en una sola aplicación, lo que permite conectarse a otras computadoras de la red para consumir los recursos expuestos por los otros nodos de la red, pero al mismo tiempo, funciona como un Servidor, lo que permita que otros nodos se conecten a nuestro software para leer los recursos que nosotros exponemos.
Algo interesante de esta arquitectura es que el software puede funcionar como Cliente y Servidor al mismo tiempo, por lo que podríamos estar compartiendo recursos al mismo tiempo que consumir recursos de otro nodo de la red.
Si bien, P2P utiliza los mismos conceptos que una arquitectura Cliente-Servidor para conectar a todos los nodos de la red, la verdad es que buscan solucionar problemas diferentes. Por una parte, la arquitectura Cliente-Servidor solo tiene un servidor, el cual centraliza los datos, recursos, seguridad, lógica de negocio, etc. De tal forma que, si el servidor se cae, se cae todo el sistema, por otra parte, la arquitectura P2P busca que no exista un servidor central, si no que cada computadora dentro de la red funcione como un Cliente y un Servidor al mismo tiempo, de tal forma que, entre más usuarios conectados a la red, más servidores se unen también a la red.
En una arquitectura Cliente-Servidor entre más usuario conectados existan, más carga se acumula sobre el servidor, mientras que en una arquitectura P2P, entre más computadoras conectadas existan en la red, más poder de procesamiento se agrega, lo que lo vuelve una red con una increíble capacidad de escalamiento.
Como se estructura P2P
Para comprender mejor como es que una aplicación P2P se estructura, es importante conocer las diferentes formas de implementarlo. A pesar de que la arquitectura P2P busca la descentralización y que mencionamos que no es necesario un servidor central, existen variantes que lo requieren, por lo que la arquitectura P2P puede variar en función del objetivo que estamos buscando resolver. Para esto, podemos clasificar una arquitectura P2P basado en su grado de centralización:
Arquitectura P2P Puro no estructuradas
Este tipo de arquitectura conforman una red totalmente descentralizada, donde no existe un servidor central ni roles donde algún nodo de la red tenga más privilegios o responsabilidades, además, todos los pares actúan como cliente y servidor al mismo tiempo, estableciendo una comunicación simétrica entre sí.
En esta arquitectura un par solo se puede comunicar con los pares que conozca, es decir, que conoce la ubicación exacta. Ha estos pares conocidos se le conoce como vecinos, por lo que cada par puede tener un número de vecinos diferentes:
Como podemos ver en la imagen, pueden existir muchas sub-redes donde un par conoce a algunos vecinos y otras sub-redes conocen a otros vecinos diferentes, y a pesar de que todos son partes de la red P2P no todos los pares se conocen entre sí, por lo que un par solo podrá localizar y buscar recursos sobre los vecinos que conozco, lo que provoca que sea imposible llegar a los pares que no conocemos.
Arquitectura P2P pura estructurada
La arquitectura P2P estructurada es una variante de la P2P no estructurada, por lo que mucho de la teoría planteada anteriormente aplica exactamente igual, sin embargo, la arquitectura P2P estructurada cambia la forma de buscar los recursos. En lugar de usar el método por inundación, busca los recursos basados en Tablas Hash Distribuidas (DHT por sus siglas en inglés).
Esta tabla hash mantiene un registro de todos los recursos disponibles en la red en un formato Clave-Valor (Key-Value), donde la clave es un hash del recurso y el valor corresponde a la ubicación (nodo) donde se encuentra el recurso, de esta forma, solo es necesario buscar el clave hash del recurso en la tabla para conocer su ubicación, sin embargo, no están fácil como parece. Debido a que la tabla hash es distribuida, no existe físicamente un solo servidor, sino que está distribuida entre todos los nodos de la red, y cada nodo guarda un fragmento del índice total de los recursos compartidos.
Como podemos ver en la imagen, cada nodo es responsable de almacenar y tener actualizada una fracción de la tabla hash, evitando que un solo nodo tenga toda la tabla o que todos los nodos tengan toda la tabla
Arquitectura P2P Híbridos
La arquitectura P2P híbrida o también conocida como Centralizada se caracteriza por tener un servidor central que sirve de enlace entre los nodos de la red, de tal forma que cualquier solitud para consumir los recursos de otros nodos deberán pasar primero por este servidor.
La diferencia fundamental que tiene esta arquitectura con el Cliente-Servidor es que, este servidor no es el que proporciona los recursos, sino que solo sirve de enlace para conectar con otros nodos. Un ejemplo claro de esta arquitectura es Napster, un programa muy famoso para descargar música en formato MP3. En este sentido, el servidor central de Napster no es quien almacena la información, sino que solo tiene el registro de todos los nodos conectados a la red y que archivos tiene cada nodo para compartir, de esta forma, cuando lanzamos una búsqueda, el servidor central de Napster sabe que nodos tiene ese archivo y nos dirige para que comencemos a descargar el archivo directamente sobre el nodo que tiene el archivo sin necesidad de un intermediario, de esta forma, Napster nunca tiene los archivos, pero sabe quién sí.
Como podemos apreciar en la imagen anterior, todos los nodos de la red (computadoras) pueden comunicarse entre sí, sin embargo, siempre hay un servidor central que servirá de vinculo para todos los demás nodos.
Ventajas
Alta escalabilidad: Las redes P2P permiten escalar fácilmente, pues a mayor número de nodos, más recursos hay disponibles y la carga de trabajo se divide entre todos los participantes.
Tolerancia a fallas: Tener los recursos distribuidos por varios nodos permite que los recursos estén disponibles sin importar si algunos de los nodos se caen.
Descentralización: Los sistemas P2P puros tiene una autonomía completa, por lo que pueden funcionar si un servidor central que organice toda la red.
Privacidad: Debido al sistema de búsqueda por inundación o tablas hash, es posible tener un alto nivel de privacidad, pues no es tan fácil saber que nodo fue el que realizo la petición inicial.
Equilibrio de carga: En una arquitectura P2P, todos los nodos de la red tienen el mismo rol y responsabilidades, por lo que toda la carga de trabajo se equilibra entre todos los nodos de la red.
Desventajas
Alta complejidad: Las arquitecturas P2P tiene una complejidad muy alta para desarrollarse, ya que tenemos que crear aplicaciones que funcionen como cliente y servidor, al mismo tiempo que tenemos que garantizar que las búsquedas de los recursos sean eficientes.
Control: A menos que tengamos un servidor central para administrar los recursos que se buscan y los usuarios que se conectan a la red, es muy fácil perder el control sobre el contenido que se puede compartir en la red.
Seguridad: Esta es una de las características menos implementadas en este tipo de arquitecturas, para evitar la intercepción de las comunicaciones, nodos maliciosos, contenido falso o adulterado o la propagación de virus o programas maliciosos.
Tráfico: En redes no optimizadas como las no estructuradas, podemos saturar la red con una gran cantidad de tráfico para propagar las peticiones a los nodos adyacentes.
Conclusiones
Como hemos podido analizar, la arquitectura P2P se caracteriza por su capacidad de crecer a medida que más nodos entran a la red, de tal forma que entre más nodos se conectan, más poder de procesamiento de agrega a la red, al mismo tiempo que la hace más difícil de detener.
No es común que se nos presente la necesidad de diseñar una aplicación con esta arquitectura, sin embargo, es importante entender cómo funcionan, pues seguramente utilizamos o estamos utilizando alguna aplicación que la utilice.
Acerca de este libro
Todo lo que acabas de ver en este artículo es solo una pequeña parte del libro Introducción a la arquitectura de software, el libro más completo en español sobre arquitectura de software, donde cubrimos los temas más importantes para convertirte en un arquitecto de software profesional.
¿Quieres convertirte en arquitecto de software pero no sabes cuál es el camino adecuando? o simplemente no sabes que guía estudiar para convertirte en arquitecto de software, te invito a que veas mi libro: