Introducción a la arquitectura hexagonal: conceptos básicos y cómo utilizarla
Llevo años escuchando sobre la arquitectura hexagonal y seguro que si has llegado aquí es porque también estás interesado en obtener más información sobre ella. La idea general de este pequeño artículo es explicar de manera simple que es la arquitectura hexagonal, como podría utilizarse y explicar sus componentes. También intentaré mostrar ejemplos en otros artículos. Espero puedas encontrar esta información útil.
¿Qué es la arquitectura hexagonal?
La arquitectura hexagonal, también conocida como arquitectura de puertos y adaptadores, fue propuesta por Alistair Cockburn en 2005. Esta arquitectura busca separar la lógica de negocio y lograr que sea lo más puro posible y agnóstica al framework, base de datos o herramienta de eventos que se utilicen. Esto permite empujar la decisión de cómo se usará esta lógica de negocio lo más tarde posible durante el desarrollo. Tal vez un dibujo pueda ayudar a entender mejor el concepto:
De seguro ya has visto esto muchas veces, la lógica de negocio queda encapsulada en este hexágono que por cada cara tiene puertos que pueden ser entrada o salida, las flechas representan el flujo del puerto y las cajas representan los adaptadores que se conectan a estos puertos, ya sea inyectando comandos, información o peticiones o bien enviando la información afuera del hexágono. ¿Todo bien hasta aquí?, te presento las partes de la arquitectura.
Aplicación
El hexágono del centro se le conoce como Core o lógica de negocio. La idea de este Core es que no sepa nada de quién envía o para dónde va la información, ni si se trata de un servidor web o un interfaz de comandos. Debe ser escrita en el lenguaje elegido de la manera más pura posible (sin frameworks). Como puedes ver, esto te permite testear la lógica de negocio de manera aislada, sin necesidad de montar el servidor HTTP ni la base de datos.
Actores
Los actores son los componentes que interactúan con el Core y están por fuera de él. Se pueden clasificar de dos formas:
Actores conductores (o primarios):
También conocidos como “Drivers actors” en inglés, son los componentes que aplican estímulos a nuestro Core y disparan efectos secundarios en la lógica de negocio.
Actores conducidos (o secundarios):
También conocidos como “Driven actors” en inglés, son los componentes a los que nuestra lógica de negocio envía información o acciones. Estos actores suelen ser bases de datos, colas de eventos o algún otro tipo de petición hacia otro servicio.
Puertos:
Los puertos son interfaces, son definiciones que debe tener un adaptador para poder conectarse a nuestro Core y enviar o recibir información. Las definiciones deben estar escritas en nuestro Core y no fuera de él.
Adaptadores:
Los adaptadores son la implementación de las interfaces de los puertos. Los adaptadores deben tener todos los métodos que los puertos requieran o definan. Por ejemplo, si nuestro Core tiene dos puertos: uno de entrada que solo permite la función “EnviarMensaje” y uno de salida que solo permite la función “GuardarMensaje”, entonces nuestro adaptador del lado conductor solo puede llamar a “EnviarMensaje” y nuestro adaptador del lado secundario solo debe tener la función “GuardarMensaje”.
Uff… todo esto fue explicado muy, pero muy a la rápida, para profundizar más: Arquitectura Hexagonal — Patrón Puertos y Adaptadores | Hexagonal Me
Usando la arquitectura
Problema
Como problema, me propuse uno que, aunque no es muy grande, podría causar muchas pérdidas si falla. Esto lo convierte en un buen caso de prueba para la arquitectura hexagonal.
Una empresa agricultora necesita controlar sus sistemas de riego, clima y dispositivos de su nuevo gran invernadero automatizado. Para ello, requiere conocer con precisión la temperatura y humedad actual del lugar, encender el sistema de riego en ciertos intervalos y ventilar o calentar el invernadero dependiendo de cómo se mueve el clima.
Que problemón nos armamos.
Solución
Mi propuesta es la siguiente:
Crearé una arquitectura hexagonal que reciba mensajes de los sensores de clima. Cuando se cumplan ciertas condiciones, dispararé acciones en los dispositivos para encender o apagar el sistema de riego, ventilación o calefacción.
Para llevar esto a cabo, publicaré cada acción en una cola de Kafka y en una base de datos SQLite. Además, utilizaré Docker para empaquetar la solución en contenedores.
Bien, ya definida la explicación y el problema continuaré en un siguiente post.
Si te ha gustado este artículo sobre la arquitectura hexagonal, no olvides seguir nuestra serie para aprender más y ver ejemplos prácticos en distintos lenguajes de programación. También puedes dejar un comentario con tus preguntas o sugerencias. ¡Espero verte en mi próxima publicación!