Hoy en día las empresas están empezando a tomar iniciativas para aparcar el monolito y empezar con los sistemas distribuidos.
Pero ello trae consigo muchos dolores de cabeza, ya que las arquitecturas de ambos sistemas van a ser completamente diferentes.
El mayor punto diferencial es que cuando usamos monolitos, por norma general se hace la vista gorda al dominio de cada sección de la aplicacion, a que partes de la base de datos un proceso puede acceder etc. ello trae consigo mejoras como el rendimiento. Al final si haces una llamada a la base de datos es más rápida que hacer una llamada a un endpoint y de ahí a la base de datos.
El problema viene cuando pasamos de unos cientos de requests a miles, y debemos escalar el sistema, en ese momento nos daremos cuenta de que no es posible, o de que tener microservicios lo haría mucho mas robusto y fiable.
Con esto quiero decir que los sistemas distribuidos son una solución, igual que es una solución viable utilizar un monolito o un monolito modular.
Cada solución tiene sus pros y contras, utilizar sistemas distribuidos para un sistema pequeño como un blog es hacer un overkill (utilizar más de lo que necesitas) y en este caso un monolito o un monolito modular sería ideal.
Índice
1 - Qué es un sistema distribuido?
Como su nombre indica, un sistema distribuido es un sistema donde sus componentes están ubicados en diferentes máquinas en una red, estas máquinas pueden ser máquinas reales, osea diferentes servidores, o máquinas virtuales (contenedores, pods, etc) pero configurados de tal forma que pueden comunicarse entre ellos y de cara al usuario no se aprecia que sean servidores o máquinas diferentes.
Un ejemplo muy común de un sistema distribuido sería una arquitectura de microservicios, pero los microservicios son únicamente la punta del iceberg. Durante este curso vamos a ver diferentes técnicas que van a permitir construir sistemas completamente distribuidos de una forma confiable.
1.1 - Ventajas de los sistemas distribuidos
- Fiabilidad: Como hemos mencionado, los sistemas distribuidos están distribuidos, eso implica que no vamos a tener toda nuestra infraestructura en una sola máquina, además, tendremos réplicas, etc. por lo que si una máquina falla, por ejemplo, un disco duro explota la aplicación debería seguir pudiendo funcionar durante el tiempo que tardamos en reemplazar el disco duro dañado.
- Escalabilidad: Uno de los grandes beneficios que podemos observar es que podemos escalar partes de nuestra aplicación individualmente, y esta es una gran ventaja respecto al monolito. En una arquitectura distribuida si tenemos una parte que recibe una mayor carga a cierta hora del día, únicamente debemos escalar horizontalmente o verticalmente para cubrir esa demanda extra.
- Rendimiento: Relacionado con el punto anterior, podemos distribuir la carga de trabajo entre diferentes máquinas, lo que hará que no se afecten entre ellas.
1.2 - Desventajas de los sistemas distribuidos
- Latencia: Uno de los puntos principales es que vamos a tener todo separado, por lo tanto entre unos sistemas y otros vamos a tener que comunicarnos a través de la red, ello genera algo de retraso (latencia) comparado con otras arquitecturas como los monolitos.
- Observabilidad: Cuando empezamos con arquitecturas distribuidas empezamos a tener más aplicaciones, más procesos corriendo individualmente que actúan como triggers, etc. Para no volvernos locos si el sistema crece un poco, hay que ser muy conciso con la observabilidad, utilizar software y técnicas que nos permiten seguir el flujo de los datos nos será muy útil en caso de tener algún problema, y además nos ayudará a tener un mayor conocimiento del sistema.
- El cambio de mentalidad: Con la llegada de los sistemas distribuidos debemos cambiar no solo la forma en la que diseñamos los sistemas sino la forma en la que programamos utilizando nuevas técnicas. Este cambio lleva tiempo y práctica. Si eres nuevo en el mundo de los sistemas distribuidos, recuerda que nadie nace aprendido y que todo cambio lleva dedicación, no te desesperes.
2 - Vocabulario de los sistemas distribuidos
Con nuestro cambio de mentalidad llegan nuevas tecnologías, y esas tecnologías pueden ser confusas de entender al principio. Sobre todo porque muchas veces no tienen sentido por sí solas, pero una vez ves el resultado final, tienen todo el sentido del mundo.
Por ello durante este curso veremos dichas técnicas o formas de trabajo.
En este post vamos a arañar la superficie mencionando los nombres y añadiendo un poco de luz a su representación.
Esta será la arquitectura inicial sobre la que vamos a trabajar:
Cabe destacar que veremos post específicos de cada una de estas tecnologías con sus implementaciones y el código lo tendrás siempre disponible en el proyecto Distribt en GitHub .
Algunos de los elementos que vamos a ver son:
- Patrón API Gateway : Un servicio que nos permite tener un único punto de entrada a nuestra aplicación.
- Service discovery/registry: El servicio que nos permitirá localizar servicios, ya sean internos o externos entre sí.
- Comunicación síncrona con HTTP o gRpc.
- Comunicación asíncrona con colas o mensajes busses utilizando el patrón consumers producers.
- Eventual consistencia: Todos los microservicios contienen la información actualizada, eventualmente, no a la vez (normalmente milisegundos).
- Sagas, CRQs y mucho más!
2.1 - Abstracciones de los vendors
Un vendor no es más que la aplicación, software o servicio que utilizas para implementar una funcionalidad, por ejemplo si pensamos en la base de datos, puede ser MySql, MSSql, MariaDb, Sqlite, MongoDb, DynamoDb, Oracle, etc.
Cada una tiene una implementación diferente, lo que implica que en cada servicio que queremos utilizar, debemos crear la implementación de una forma específica.
Para mí, es muy importante crear un código común, el cual va a ser utilizado por múltiples servicios en forma de librería, en el cual abstraemos toda esa lógica y dejamos un único punto de entrada que será agnóstico al vendor que vamos a utilizar.
Estas librerías suelen llamarse Common
o Shared
, y yo las recomiendo personalmente, ya que si un día quieres cambiar de un servicio a otro, deberás hacer el cambio una única vez y actualizar las librerías en los servicios que las utilizan. Y recuerda que este paso se puede automatizar.
Conclusión
- En este post hemos visto una introducción a los sistemas distribuidos.
- Las ventajas y las desventajas de los sistemas distribuidos.
- Finalmente hemos visto parte del vocabulario utilizado en los sistemas distribuidos.
Si quieres aprender más sobre los mismos no olvides seguir la web a través del RSS, o al canal de youtube, donde subiré los vídeos sobre cada uno de los aspectos.