El reto
La plataforma original estaba formada por un backend legacy compuesto por un core desarrollado en C, servicios de comunicación mediante WebSockets implementados en Java y un frontend Angular. La arquitectura presentaba un elevado acoplamiento entre componentes, dificultando enormemente la evolución funcional, el mantenimiento y la escalabilidad del sistema.
Cada nueva funcionalidad requería modificar distintos componentes del sistema, incrementando el riesgo de regresiones y reduciendo la velocidad de entrega. Además, la plataforma no estaba preparada para soportar una evolución independiente de los distintos dominios funcionales.
La estrategia de modernización
Se diseñó una nueva plataforma V2 construida completamente desde cero, manteniendo la convivencia temporal con el sistema legacy mientras se realizaba una migración progresiva de las funcionalidades.
La nueva arquitectura se diseñó siguiendo los principios de Domain-Driven Design (DDD) y Arquitectura Hexagonal, definiendo bounded contexts alineados con las capacidades de negocio y desacoplando completamente el dominio de la infraestructura mediante puertos y adaptadores.
Arquitectura de Microservicios
La plataforma fue desarrollada utilizando Java 21 y Quarkus para maximizar el rendimiento y reducir el consumo de recursos. Cada microservicio fue diseñado para ser completamente independiente, con su propio modelo de dominio, contratos bien definidos y despliegue autónomo.
La comunicación entre servicios se implementó mediante Apache Kafka siguiendo un modelo Event-Driven Architecture, reduciendo el acoplamiento entre dominios y permitiendo una integración completamente asíncrona.
Los contratos REST fueron definidos mediante OpenAPI y los eventos mediante AsyncAPI, garantizando una comunicación consistente entre todos los equipos de desarrollo.
Persistencia y Migración de Datos
La estrategia de persistencia se basó en PostgreSQL como base de datos principal, gestionando la evolución del esquema mediante Flyway y utilizando vistas materializadas para optimizar consultas complejas y procesos de migración de información.
Esta aproximación permitió evolucionar el modelo de datos de forma controlada, garantizando la compatibilidad entre versiones y reduciendo el riesgo durante los despliegues.
Observabilidad
Desde el inicio del proyecto se diseñó una estrategia de observabilidad basada en Micrometer para la instrumentación de métricas de aplicación, Prometheus para su recopilación y Kibana para el análisis centralizado de logs y monitorización operativa.
Esta plataforma permitió disponer de métricas técnicas y de negocio en tiempo real, detectar cuellos de botella, analizar incidencias y reducir considerablemente los tiempos de resolución.
Calidad del Software
La calidad del software se convirtió en uno de los pilares fundamentales del proyecto mediante una estrategia basada en Test-Driven Development (TDD), pruebas unitarias, pruebas de integración y validación continua utilizando Testcontainers para reproducir entornos reales durante la ejecución de los tests.
Todo el ciclo de desarrollo quedó integrado en pipelines de Integración Continua mediante Jenkins, incorporando análisis estático con SonarQube, validaciones automáticas y despliegues completamente automatizados.
Liderazgo Técnico
Como Tech Lead participé en la definición de la arquitectura de la plataforma, establecimiento de estándares de desarrollo, definición de contratos entre servicios, revisión técnica de soluciones y alineación entre los distintos equipos de desarrollo.
Se definieron estándares comunes de arquitectura, convenciones de desarrollo, estrategias de versionado, buenas prácticas de observabilidad, testing y gobierno técnico para garantizar la evolución homogénea de toda la plataforma.