Skip to content

Architecture

Este documento describe la arquitectura de nuestros microservicios, que sigue una combinación de principios de Arquitectura Limpia y Arquitectura Hexagonal. Este enfoque, junto con nuestras herramientas de calidad de código y bibliotecas de utilidades, contribuye a aplicaciones de alto rendimiento, mantenibles y robustas.

Clean Architecture + Hexagonal Architecture

Section titled “Clean Architecture + Hexagonal Architecture”

Nuestros microservicios siguen un enfoque híbrido que combina Arquitectura Limpia y Arquitectura Hexagonal (también conocida como Puertos y Adaptadores). Esta arquitectura está organizada en capas concéntricas:

src/
├── app/ # Servicios de aplicación/casos de uso
├── domain/ # Entidades de dominio y lógica de negocio
├── infrastructure/# Interfaces externas y adaptadores
│ ├── apm/ # Monitoreo de Rendimiento de Aplicaciones
│ ├── http/ # Servidor HTTP y componentes relacionados
│ │ ├── controllers/
│ │ ├── middlewares/
│ │ ├── routes/
│ │ └── server.ts
│ └── logger/ # Funcionalidad de registro
├── config/ # Archivos de configuración
└── bin/ # Archivos ejecutables
  1. Regla de Dependencia: Las dependencias siempre apuntan hacia adentro. Las capas externas pueden depender de las capas internas, pero las capas internas no pueden depender de las capas externas.
  2. Centrado en el Dominio: La capa de dominio contiene la lógica de negocio y es independiente de las preocupaciones externas.
  3. Puertos y Adaptadores: La aplicación define “puertos” (interfaces) que son implementados por “adaptadores” en la capa de infraestructura.
  4. Separación de Preocupaciones: Cada capa tiene una responsabilidad específica y no necesita conocer los detalles de otras capas.
  • Testabilidad: La lógica de negocio puede ser probada independientemente de las dependencias externas.
  • Flexibilidad: Los componentes externos pueden ser reemplazados sin afectar la lógica de negocio central.
  • Mantenibilidad: La clara separación de preocupaciones hace que la base de código sea más fácil de entender y mantener.
  • Escalabilidad: Diferentes partes del sistema pueden ser escaladas independientemente.

La biblioteca Either proporciona un enfoque funcional para el manejo de errores. Representa un valor que puede ser de uno de dos tipos: Left (típicamente un error) o Right (típicamente un valor de éxito).

Para más detalles y ejemplos de uso, consulte la documentación completa de Either.

La biblioteca RFC7807 implementa el estándar RFC 7807 para respuestas de error de API HTTP. Proporciona un formato de respuesta de error estandarizado, manejo de errores consistente en todos los microservicios, clara distinción entre errores controlados y no controlados, y una experiencia de cliente mejorada con información detallada de errores.

Esta biblioteca permite crear objetos ProblemDetail para diferentes códigos de estado HTTP, personalizar títulos y detalles de errores, y proporcionar información adicional sobre problemas específicos. Es una parte fundamental de nuestra estrategia de manejo de errores, asegurando que todas las APIs proporcionen respuestas de error consistentes y útiles.

La biblioteca Context proporciona middleware para la gestión del contexto de solicitud, permitiendo rastrear información contextual a través de toda la cadena de llamadas.

Para más detalles y ejemplos de uso, consulte la documentación completa de Context.

La biblioteca Logger proporciona registro estructurado con seguimiento de contexto, facilitando el análisis de logs y la depuración de problemas.

Para más detalles y ejemplos de uso, consulte la documentación completa de Logger.

La biblioteca Healthcheck proporciona monitoreo de salud del sistema, permitiendo verificar la salud de los componentes y exponer endpoints de verificación para orquestadores.

Para más detalles y ejemplos de uso, consulte la documentación completa de Healthcheck.

Utilizamos varios patrones de diseño en nuestros microservicios para resolver problemas comunes de manera elegante y mantenible. Para ver detalles sobre los patrones que utilizamos.

Nuestra arquitectura y herramientas contribuyen a aplicaciones de alto rendimiento de varias maneras:

  1. Uso Eficiente de Recursos: La separación clara de preocupaciones previene el consumo innecesario de recursos.
  2. Manejo Optimizado de Errores: El patrón Either y RFC7807 proporcionan un manejo eficiente de errores sin bloques try/catch excesivos.
  3. Calidad de Código: ESLint y Prettier imponen prácticas que conducen a un código más eficiente.
  4. Mantenibilidad: Una arquitectura clara facilita la optimización de cuellos de botella de rendimiento.
  5. Testabilidad: Las pruebas exhaustivas aseguran que las regresiones de rendimiento se detecten temprano.

Nuestro flujo de trabajo de desarrollo está diseñado para mantener la calidad y consistencia del código:

  1. Linting y Formateo: Linting y formateo automáticos en commit con husky y lint-staged
  2. Commits Convencionales: Formato de mensaje de commit impuesto con commitlint
  3. Pruebas: Suite de pruebas exhaustiva con Jest
  4. CI/CD: Pipelines automatizados de prueba y despliegue

La combinación de Arquitectura Limpia, Arquitectura Hexagonal, herramientas de calidad de código y bibliotecas de utilidades crea una base robusta para nuestros microservicios. Este enfoque nos permite construir aplicaciones de alto rendimiento, mantenibles y escalables que pueden evolucionar con los cambiantes requisitos del negocio.

Al seguir estos principios arquitectónicos y aprovechar nuestras bibliotecas de utilidades, aseguramos que nuestros microservicios sean:

  • Mantenibles: Clara separación de preocupaciones y estilo de código consistente
  • Testables: Componentes independientes que pueden ser probados de forma aislada
  • Flexibles: Capacidad de intercambiar dependencias externas sin afectar la lógica de negocio central
  • Performantes: Uso eficiente de recursos y manejo optimizado de errores
  • Robustos: Manejo exhaustivo de errores y monitoreo de salud

Esta arquitectura proporciona una base sólida para construir microservicios complejos que pueden escalar con nuestras necesidades de negocio.