Francisco Airam Hernández Crosa

Desarrollador Backend · Java 25 + Spring Boot 4 · Optimización de rendimiento en producción

Experiencia real en entornos de producción: –98% de latencia en endpoints críticos, –99% en procesos de migración multihilo. Especializado en arquitecturas Java modernas, integración de IA y sistemas distribuidos.

Scroll

About me

Backend developer especializado en el ecosistema Java moderno (Java 25, Spring Boot 4, Virtual Threads) con experiencia real en optimización y modernización de sistemas en producción.

Actualmente en Atlantis Technology como Desarrollador Backend (Spring Boot), modernizando sistemas legacy con impacto medible: –98% de latencia en endpoints críticos (2.2s → 35ms, reconocido por el cliente), –99% en procesos de migración multihilo (5h → 3min) y erradicación de N+1 en cientos de consultas. Paralelamente, como Coordinador Digital en la Asociación Juvenil Proyecto Dubini, diseñé la arquitectura de la infraestructura interna priorizando compilación nativa (GraalVM) para operar en instancias cloud de recursos mínimos.

En paralelo, desarrollo mods para Minecraft Forge como campo de práctica de conceptos avanzados de Java: Mixins, sistemas de estado persistente, integración con APIs de terceros y diseño event-driven.

📍 La Laguna, Santa Cruz de Tenerife

98%
Reducción de latencia en endpoints críticos
99%
Eficiencia en procesos multihilo de datos
89.7%
Reducción de ancho de banda (Caché)
78%
Reducción de tiempo de carga en cold-start

¿Te parecen números demasiado optimistas? Haz clic en cada tarjeta para ver el desglose técnico y la arquitectura detrás de estas métricas.

Experience

Desarrollador backend (Spring Boot)

Atlantis Technology Enero 2026 - Actualidad (7 meses) Híbrido
  • Modernización, optimización y migración de sistemas: Transformación tecnológica de más de 5 sistemas críticos, migrando de Java 8 a 21 (y Java 25) y Spring Boot 2.x a 4.x, garantizando la continuidad y estabilidad del servicio.
  • Optimización de Latencia y Complejidad: Reducción de la latencia de endpoints críticos hasta en un 98% (de 2.2s a 35ms) (resultados formalmente reconocidos por el cliente), optimizando la complejidad algorítmica de O(N) a O(1) y erradicando problemas de N+1 en cientos de consultas con Criteria API y Batch Fetching.
  • Procesos Multihilo de Datos: Reingeniería completa de procesos de migración, adaptación y anonimización de datos mediante técnicas avanzadas de multihilo, alcanzando una mejora de eficiencia del 99% (reducción de 5 horas a 3 minutos).
  • Desarrollo AI-First: Incremento sustancial en la velocidad de entrega de software mediante flujos de trabajo AI-first, manteniendo estrictos estándares de calidad, testing y observabilidad para producción.

Coordinador Digital

Asociación Juvenil Proyecto Dubini Septiembre 2025 - Actualidad (11 meses)
  • Decisión de arquitectura: Spring Data JDBC sobre JPA/Hibernate por incompatibilidad de Hibernate con la compilación nativa AOT de GraalVM. Resultado: cold start <5s, consumo <128 MB RAM, desplegable en instancias cloud de bajo coste (free tier).
  • Infraestructura y Sistemas: Migración completa de gestión en Excel a aplicación a medida (Spring Boot + Angular 22 Zoneless), con Google OAuth 2.0 como único acceso interno e integración con Google Drive API v3 para gestión documental.
  • Plataforma de Blog & Web: Arquitectura distribuida con Spring WebFlux, caché multinivel (Caffeine en memoria + persistencia en disco) con invalidación por eventos, reducción del 89.7% de ancho de banda frente a servicio sin caché.
  • Museo Virtual: Experiencia interactiva estilo Google Street View con sistema de reservas para visita virtual del jardín-museo.
  • Pipeline CI/CD: GitHub Actions para build, publicación de imagen Docker en Docker Hub y despliegue automático con compilación nativa GraalVM.

Desarrollador Fullstack en Prestashop - Formación Profesional Dual

Sagrera Canarias Abril 2025 - Junio 2025 (3 meses) La Laguna (Presencial)
  • Diseño, desarrollo e implementación de nuevas funcionalidades en producción con completa autonomía y colaboración directa con equipos no técnicos.
  • Optimización de Rendimiento: Mejora drástica del rendimiento de tareas pesadas en base de datos (1h → 15s) mediante el uso de CTEs (Common Table Expressions) y optimizaciones SQL, reduciendo +5000 consultas SQL a solo 5.
  • UX/UI & Usabilidad: Implementación de más de 20 mejoras visuales y de usabilidad móvil aumentando drásticamente la conversión en producción.

Características destacadas desarrolladas:

  • Sistema de Reseñas: Flujo de feedback post-compra con emails automáticos y tokens únicos de validación.
  • Programa de Socios: Sistema completo de fidelización con registro cruzado de datos de usuarios entre tienda física y online.
  • Recuperación de Carritos Abandonados: Herramienta de backoffice con links personalizados y generación de descuentos dinámicos para captación de clientes.

Projects

Smart Economato (Ecosistema ERP de Gestión de Inventario Predictivo)

Plataforma empresarial de gestión de inventario para economatos de escuelas culinarias. Diseñado bajo un patrón de Monolito Modular con Arquitectura Hexagonal (Ports & Adapters) como núcleo principal (`inventory-service`) en Spring Boot 4.0 & Java 25 (aprovechando hilos virtuales, ZGC Generational y ScopedValue). Integra servicios satélites políglotas: un agente conversacional de IA en NestJS 11 que implementa el Model Context Protocol (MCP) con un Grafo de Memoria Semántica (SMG) y soporte multi-proveedor (OpenAI, Anthropic, DeepSeek, etc.), y un microservicio en Python/FastAPI con Meta Prophet para predicción de demanda de consumo a 14 días.

Hitos Técnicos Clave:

  • Ledger de Stock Inmutable: Sistema de encadenamiento criptográfico para registro de movimientos de stock, firmas HMAC-SHA256 y triggers PostgreSQL a bajo nivel que bloquean sentencias UPDATE/DELETE.
  • CQRS & Enrutamiento de Persistencia: Segregación de lectura y escritura (PostgreSQL Primary + Replica) con enrutamiento dinámico automático mediante un Aspecto AOP y `ScopedValue` en Java 25.
  • Mensajería y Resiliencia: Envío fiable de eventos a Apache Kafka (modo KRaft) mediante el patrón Transactional Outbox. Circuit breakers configurados con Resilience4j para tolerar caídas de Redis, Kafka o réplicas.
  • Frontend Moderno PWA: Progressive Web App en Angular 21 con detección de cambios Zoneless, WebSockets (STOMP sobre SockJS) para notificaciones y alertas en tiempo real, soporte offline e internacionalización.
  • Infraestructura & DevOps: Script de instalación en PowerShell (`install.ps1`) para autogenerar secretos, certificados SSL locales y configurar hosts locales. Orquestación multi-contenedor de 10 servicios con Docker Compose. Cobertura de tests unitarios y de integración con Testcontainers (PostgreSQL, Kafka, Redis) y JaCoCo.
  • La arquitectura está intencionadamente sobredimensionada para el caso de uso real. Cada patrón elegido (Hexagonal, CQRS, Kafka, MCP) tiene una justificación técnica y documenta cómo se aplica en un contexto cohesionado. Es un ejercicio de arquitectura, no de productividad mínima.

Repositorio Backend API // Repositorio Frontend // Documentación Técnica (+200 págs.)

Java 25 Spring Boot 4 Angular 21 (Zoneless) Kafka (KRaft) NestJS (MCP AI) FastAPI / Prophet CQRS Primary/Replica Testcontainers Prometheus / Grafana

AJPD Gestión (Sistema de Gestión Interna de la Asociación)

Digitalización completa de la infraestructura de TI de la Asociación Juvenil Proyecto Dubini (AJPD), sustituyendo el flujo de trabajo manual basado en Excel por una aplicación de gestión robusta, eficiente y segura.

Arquitectura y Backend (Java 21 & Spring Boot 3.4.1): Diseñado con un enfoque modular y optimizado para compilación AOT (GraalVM Native Image). Utiliza Spring Data JDBC para evitar la magia reflexiva y sobrecarga en runtime de JPA/Hibernate tradicional, garantizando total compatibilidad nativa y reduciendo el consumo a solo 128 MB de RAM. Cuenta con login mediante Google OAuth2 y firmas JWT seguras.

Frontend e Interfaz (Angular v22.0.0 Zoneless): Desarrollado con componentes standalone y cambio de estado Zoneless, optimizando el rendimiento. Utiliza vanilla CSS con transiciones de estado y micro-animaciones personalizadas, PWA para funcionamiento offline y RxJS para flujos de datos.

Características Destacadas de la UI:

  • Búsqueda Inteligente: Filtro reactivo de miembros con Debounce (pooling con delay de 1s) para economizar consultas en base de datos.
  • Gestión de Bajas Visual: Visualización atenuada y cambio de comportamiento automático ("Dar de baja" a "Eliminar") para ex-miembros.
  • Línea de Tiempo Dinámica: Historial y evolución de cargos del miembro presentados mediante un timeline vertical interactivo.
  • Gestión Documental Separada: Sub-modal CRUD que interactúa con la API de Google Drive v3 para almacenar y eliminar DNI/fotos usando enlaces temporales firmados generados por el backend, e integración con Supabase Storage para la web pública.

Repositorio Backend API // Repositorio Frontend

Java 21 Spring Boot 3.4 Spring Data JDBC Angular 22 (Zoneless) GraalVM Native Google Drive API v3 Supabase Storage Google OAuth 2.0

Plataforma de Blog (Proyecto Dubini)

Desarrollo end-to-end de una plataforma de publicaciones con arquitectura distribuida. El sistema cuenta con un proveedor frontend que sirve archivos estáticos y cachea los contenidos, y un Backoffice para edición y administración de contenido.

La comunicación entre servicios es asincrónica mediante WebFlux y está protegida con JWT. Implementación de un sistema de caché de doble capa (Caffeine en memoria + persistente en disco), circuit breaker e invalidación por eventos. Gracias a este enfoque, el consumo de ancho de banda se redujo en un 89.7%, operando fluidamente en entornos cloud limitados.

Visita la web // Repositorio frontend provider // Repositorio backoffice

Java Spring Boot Spring Security WebFlux Caffeine Cache Microservicios Service Workers

Chat Seguro con Node.js

Plataforma de mensajería en tiempo real desarrollada con Node.js, con autenticación JWT, roles Admin/Usuario, hash de contraseñas con bcryptjs y rutas protegidas mediante middleware. Endpoints RESTful en Express.js y conexión a MySQL mediante connection pooling.

Comunicación en tiempo real con WebSockets usando Socket.io, con persistencia básica de mensajes y seguimiento del estado en línea. Se aplicaron buenas prácticas de seguridad como validación de entradas con express-validator y manejo de errores asincrónico.

Repositorio aquí

Node.js Express.js MySQL JWT Socket.io

Minecraft Modding (Java)

Campo de práctica de conceptos avanzados de Java: Mixins para modificación de bytecode, integración con APIs de terceros, diseño de sistemas de estado persistente y arquitecturas event-driven bajo restricciones de rendimiento.

Epic Scorch: Reforged

Minecraft 1.20.1 · Forge 47.2.20 · Epic Fight API · Mixins

Bridge y expansión de combate táctico entre Epic Fight y Scorched Guns. Diseña un sistema híbrido de animación en el cual la cámara en primera persona mantiene la inmersión clásica del shooter mientras que la tercera persona aprovecha el motor de animaciones de Epic Fight.

  • Consumo de Estamina por Recoil: Integración de armas de fuego en el motor de movimiento de Epic Fight.
  • Restricciones de Movimiento: Bloqueos tácticos al disparar, apuntar o recargar mientras se corre, salta o esquiva.
  • Configurabilidad: Archivos de configuración a bajo nivel para ajustar balance, retroceso y consumo.

Ver Repositorio

Java Forge Mixins Animation Engines Game Design

LootrTeams Addon

Minecraft 1.20.1 · Forge 47.2.20 · FTB Teams Integration

Mod de Minecraft que sincroniza el loot de cofres individuales (generados por Lootr) para que sea compartido por equipos de FTB Teams. Resuelve la desconexión del juego cooperativo en servidores masivos sin perder la seguridad de cofres.

  • Loot Compartido por Equipos: El cofre abre el mismo inventario compartido e inalterable para todos los miembros del equipo.
  • Legacy Migrator: Migración automatizada sin pérdida de datos para mundos en producción ya existentes.
  • RAM Cache Optimizado: Estructura de caché para evitar consultas excesivas a disco.

Ver Repositorio

Java Forge FTB Teams API Caching Data Migration

KMC Soulslike Regen

Minecraft 1.20.1 · Forge 47.2.20 · FTB Teams & Waystones

Reemplazo completo de la regeneración natural de Minecraft por un sistema de fatiga acumulable de estilo Soulslike (UHC-style natural healing block).

  • Fatigue Capacity (maxCap): El cansancio aumenta al curarse; al llegar al límite la curación se detiene por completo.
  • Zonas de Descanso: Integración de Team Nexuses (zonas de equipo con regeneración por presencia) e Inns globales.
  • Mecánicas Adicionales: Nivelación permanente por fatiga gastada, recuperación en fogatas, bonus de supervivencia y comandos CRUD de administración.

Ver Repositorio

Java Forge Waystones API Level System Team Integration

Optimizations & Architecture

Refactorización de Capas y Optimización de Rendimiento ORM

Refactorización del acceso a datos que abarca la capa de persistencia, servicios y entidades. El desarrollo estuvo orientado a eliminar la mayor parte de la lógica duplicada bajo principios DRY, mitigar cuellos de botella estructurales producidos por estrategias de carga ineficientes y optimizar la complejidad algorítmica de las consultas.

Desafío Técnico

La aplicación presentaba una degradación relevante del rendimiento con tiempos de respuesta superiores a los 2 segundos en sus endpoints principales. El origen del problema radicaba en la sobrecarga en la transferencia de datos debido al comportamiento Eager Loading implícito en las relaciones @ManyToOne, la proliferación del problema de consultas N+1, y una ineficiente estrategia de paginación procesada en memoria (mediante el uso de subList de Java), lo que ponía en riesgo la estabilidad del sistema al escalar el volumen de datos.

Estrategia de Refactorización y Arquitectura de Persistencia

El sistema implementa una reestructuración de las capas de persistencia, servicios y entidades de la aplicación, abstrayendo la lógica redundante y delegando la carga pesada de datos directamente al motor de la base de datos de manera eficiente.

  • Carga Perezosa: Modificación de las relaciones estructurales en la capa de entidades para evitar la recuperación innecesaria de objetos adjuntos en memoria de forma por defecto.
  • Resolución Eficiente de N+1: Implementación guiada de JOIN FETCH y EntityGraphs en la capa de persistencia, reduciendo los accesos recursivos al motor relacional.
  • Anotación Transaccional Optimizada: Uso estricto de @Transactional(readOnly = true) en métodos de consulta para optimizar los flujos de lectura en gran medida y reducir de forma significativa el proceso de dirty checking de Hibernate en operaciones de lectura.
  • Centralización con Enfoque DRY: Implementación de métodos genéricos de filtrado en repositorios personalizados, logrando la eliminación de la mayor parte de la lógica duplicada.

Flujo de Ejecución y Paginado más Eficiente

1
ID Projection Nativa (Base de Datos)

Se delega la paginación nativa al motor de la BD. El sistema filtra e identifica primero únicamente los IDs de los registros correspondientes al segmento solicitado, reduciendo la transferencia inicial de datos.

2
Batch Fetching Coleccionable

Una vez obtenidos los identificadores únicos, se recuperan los datos completos de las entidades en lotes agrupados, reordenando los resultados directamente en memoria para garantizar la consistencia del orden de resultados.

3
Gestión L2 Cache e Integración Hibernate-Jackson

Las consultas repetitivas de datos maestros o estáticos obtienen una respuesta en decenas de milisegundos mediante una Caché de Segundo Nivel (L2).

Resultados y Métricas de Rendimiento

x64
Aceleración en Procesos Relevantes
Latencia de búsqueda de expedientes reducida de 2.24s a ~35ms.
O(1)
Complejidad Algorítmica
Reducción de N+1 consultas a un número constante por petición.
-98%
Reducción de Latencia en Navegación
Endpoints con latencias medias (200-500ms) estabilizados por debajo de 40ms.

Análisis Comparativo de Tiempos de Respuesta

El impacto del rediseño multicapa se evidencia en la reducción de los tiempos de respuesta y en la previsibilidad de la carga en todo el sistema de la aplicación:

Segmento de Endpoint / Operación Latencia ANTES Latencia AHORA Factor Impacto (Speedup) Estado de Fluidez
Búsqueda Relevante (Expedientes) 1.18s - 2.24s 35ms - 50ms ~x42.0 Baja latencia
Búsqueda Media (Registros) 0.8s - 1.03s 20ms - 50ms ~x10.0 Estabilizada
Procesos Rápidos (Pre-optimizados) 48ms 18ms ~x2.6 Optimización adicional

Nota sobre la consistencia: Incluso en procesos que ya contaban con un rendimiento óptimo (<100ms), se logró una reducción del 50% en el tiempo de respuesta, favoreciendo una experiencia de usuario predecible y con una latencia más consistente.

Stack Técnico

Spring Data JPA Hibernate (L2 Cache) Jackson (Hibernate5Module) ID Projection Batch Fetching EntityGraphs DRY Architecture Query Optimization

Procesos de Migración y Anonimización Multihilo

Rediseño de procesos ETL para migración, transformación y anonimización en paralelo de datos históricos a gran escala, eliminando cuellos de botella de red y base de datos mediante concurrencia y caché de relaciones en memoria JVM.

Desafío Técnico

Migración de un histórico acumulado de más de 10 millones de registros con 15 años de recorrido. El proceso original secuencial tardaba más de 5 horas en completarse. El motor de base de datos sufría por la ejecución recursiva de subconsultas dinámicas lookup (aproximadamente 38 millones de subconsultas select) destinadas a resolver claves foráneas e integridad referencial en caliente para cada fila insertada, bloqueando la base de datos durante las ventanas de mantenimiento técnico.

Arquitectura y Optimización en Memoria

La solución implementada redujo las consultas de base de datos tipo N+1 durante el bucle de inserción, resolviendo todas las dependencias relacionales en caliente dentro de la JVM.

  • Precarga en Caché O(1): Carga inicial de diccionarios de lookup en memoria Java, resolviendo claves naturales a identificadores secuenciales en microsegundos y ocupando solo ~420 MB del Java Heap.
  • Concurrencia con & Thread Pools: Segmentación dinámica de los streams de datos históricos procesados de forma concurrente, aislando la escritura en disco de cada hilo.
  • Thread-Safety Garantizada: Uso de mapas de solo lectura tras la carga inicial y generación secuencial atómica de IDs para prevenir condiciones de carrera.

Flujo de Ejecución en Tres Fases

1
Precarga de Relaciones (10-12s)

Se consultan las tablas maestras origen una sola vez y se construyen mapas asociativos en memoria. El costo inicial es bajo a cambio de la eliminación de los lookups dentro del bucle principal.

2
Procesamiento Paralelo en Disco

Se lanzan tareas concurrentes a través de un pool dinámico de hilos. Cada hilo escribe de forma aislada en su propio script SQL en disco, evitando bloqueos de I/O y mezcla de sentencias.

3
Inserción Directa en Destino

El script SQL generado contiene valores literales puros precalculados. La base de datos destino ejecuta los inserts secuenciales de forma directa sin resolver índices dinámicamente, logrando una respuesta en decenas de milisegundos.

Ejemplo de Transformación SQL (Esquema Anonimizado)

ANTES: SQL Generado con Subconsultas Lookup Recursivas

INSERT INTO DETALLE_TRANSACCION (transaccion_fk, cod_detalle, info_pago, fecha_creacion)
VALUES (
  (SELECT MAX(id) FROM TRANSACCIONES t WHERE t.usuario_fk = (SELECT id FROM USUARIOS u WHERE u.token_acceso = 'USR-2026-X98A')),
  'DET-90234', 'INFO_MOCK', '2026-07-05 13:00:00'
);

AHORA: SQL Generado con Identificadores Directos Precalculados

INSERT INTO DETALLE_TRANSACCION (transaccion_fk, cod_detalle, info_pago, fecha_creacion)
VALUES (
  3489102, -- ID precalculado de forma eficiente en memoria Java (O(1))
  'DET-90234', 'INFO_MOCK', '2026-07-05 13:00:00'
);

Resultados y Métricas de Rendimiento

99%
Reducción de Tiempo Total
5 hours → 3 minutos en red corporativa
100x
Factor de Aceleración (Speedup)
Eliminación de latencia de red en subconsultas
0
Subconsultas Lookup en Destino
38M de consultas reducidas a una cantidad mínima en el bucle de inserción

Análisis Compartivo por Latencia de Red (10M de Registros)

El tiempo total del proceso varía según la latencia de red al servidor de base de datos debido al volumen de subconsultas lookup del método anterior. A continuación se detallan los tres escenarios analizados:

Escenario (Latencia) Tiempo ANTES Tiempo AHORA Aceleración (Speedup) Reducción de Tiempo
Baja Latencia (SSD Local - 0.1 ms) ~1.1 horas ~8.5 minutos ~7.7x -87.0%
Media Latencia (LAN Corporativa - 0.5 ms) ~5.3 horas ~8.5 minutos ~37.4x -97.3%
Alta Latencia (Conexión VPN - 3.0 ms) ~31.6 horas ~8.5 minutos ~223.0x -99.5%

Nota sobre el cálculo: En el entorno real, el tiempo de procesamiento se redujo de 5 horas a 3 minutos para el lote de datos ejecutado bajo una latencia media de red corporativa (~1.1 ms promedio por consulta lookup).

Conclusión

La optimización del proceso ETL no solo mejoró el tiempo de ejecución en un 99%, sino que cambió la dinámica de trabajo del equipo. Al reducir el tiempo de 5 horas a 3 minutos, pudimos iterar y validar la migración más de 60 veces durante la fase de pruebas. Esto nos ahorró semanas de trabajo manual y nos permitió detectar inconsistencias en los datos que, de otra forma, habrían sido catastróficas en el entorno de producción

Aseguramiento de la Privacidad del Cliente

⚠️ Información sobre Anonimización: Las referencias a nombres de bases de datos, esquemas relacionales, nombres de tablas, columnas y formatos de datos representados en esta sección han sido modificados significativamente y reemplazados con estructuras transaccionales genéricas.

Stack Técnico

Java Concurrency ExecutorService Thread Pools Multi-threading ETL / Data Migration

Arquitectura de Resiliencia y Auto-recuperación

Sistema de tolerancia a fallos para un backend con 4 servicios de infraestructura (PostgreSQL Primary, PostgreSQL Replica, Redis, Kafka). Diseñado para que la aplicación continúe operativa para los casos soportados aunque uno o varios servicios tengan incidencias, con detección proactiva, degradación controlada y notificación en tiempo real al frontend.

Desafío Técnico

Un backend con CQRS (escritura en Primary, lecturas en Replica), caché distribuida en Redis y eventos de auditoría via Kafka tiene múltiples puntos de fallo. Un timeout de Redis o una caída de la réplica no deberían provocar errores 500 al usuario.

Arquitectura del Sistema

4 Circuit Breakers independientes (Resilience4j) monitorizan cada servicio. Un HealthChecker proactivo testea las conexiones cada 3-5 segundos y abre el circuit breaker antes de que una petición real falle. Al levantar una incidencia o recuperación, se publica un Spring Event que un WebSocketNotificationService traduce a alertas STOMP al frontend.

  • CQRS con fallback automático: si la réplica falla, un AOP Aspect redirige las lecturas al Primary vía ScopedValue (Java 25), sin cambiar una línea de código de negocio.
  • Caché circuit-breaker-aware: un CircuitBreakerAwareCacheManager envuelve cada operación Redis. Con el CB abierto, toda operación de caché se convierte en cache-miss: la app sigue funcionando sin caché.
  • Outbox resiliente: el procesador de Kafka comprueba el estado del CB antes de cada batch. Si Kafka no está disponible, los eventos quedan en la tabla Outbox (PostgreSQL) hasta la recuperación, con Gauge de Prometheus para monitorizar el lag.
  • JWT Blacklist con failover: Redis → DB automático. Si Redis falla, la verificación de tokens revocados se hace contra PostgreSQL sin interrupción.

Flujo de Detección y Recuperación

1
Health Check Proactivo

Cada 3-5s se testean DB, Replica, Redis y Kafka. Si falla, se abre el Circuit Breaker inmediatamente.

2
Transición de Estado → Spring Event

Resilience4j emite un evento de transición (CLOSED→OPEN). Un listener lo traduce a CircuitBreakerOpenEvent.

3
WebSocket → Frontend

El servicio de notificaciones envía un código de alerta (DB_FAILURE, REDIS_FAILURE...) vía STOMP a /topic/alerts. Al reconectar, el frontend recibe el estado actual de todos los CBs.

4
Recuperación Automática

Cada 10-15s se testea la recuperación del servicio afectado. Si responde, se cierra el CB y se envía _RECOVERED al frontend.

Degradación por Servicio

El impacto de una incidencia se gestiona de forma aislada para favorecer la alta disponibilidad parcial:

  • Replica no disponible: lecturas redirigidas al Primary. Impacto: mayor carga en Primary, errores mitigados para el usuario.
  • Redis no disponible: cache-miss universal, consultas van directo a DB. Blacklist JWT cae a PostgreSQL.
  • Kafka no disponible: eventos de auditoría acumulados en tabla Outbox. Se envían cuando Kafka vuelve (entrega garantizada).
  • Primary no disponible: operaciones de escritura fallan con error controlado. Lecturas siguen via Replica si está sana.

Stack Técnico

Resilience4j (4 CBs) WebSocket STOMP Spring AOP ScopedValue (Java 25) CQRS PostgreSQL Primary/Replica Redis + Caffeine Kafka (Transactional Outbox) Prometheus / Micrometer

Cobertura de Testing

  • Tests de integración que abren cada CB y verifican que se envía la alerta WebSocket correcta (DB_FAILURE, REDIS_RECOVERED, etc.).
  • Test end-to-end de resiliencia: confirma que @Cacheable no lanza excepción con Redis CB abierto.
  • Test de failover JWT: verifica que si Redis no responde, la blacklist cae a PostgreSQL sin interrupción.
  • Test de notificación a nueva conexión WebSocket: usuario que conecta recibe el estado actual de CBs abiertos.

Conclusión

Arquitectura diseñada para una degradación controlada / alta disponibilidad parcial: la aplicación continúa operativa para los casos soportados aunque ocurran fallos en servicios auxiliares. La detección proactiva (health checks cada 3s) reduce el tiempo medio de detección frente al enfoque reactivo tradicional, y el WebSocket permite al frontend mostrar banners informativos en vez de errores genéricos.

Sistema de caché Inteligente

Sistema de caché multicapa diseñado para reducir peticiones al backend, optimizar el uso de ancho de banda y mantener la experiencia del usuario durante incidencias o mantenimiento del backoffice. Pensado para Proyecto Dubini (Asociación medioambiental juvenil): menor tráfico → menor consumo energético.

Arquitectura del Sistema

Doble capa de caché: Caffeine en memoria para acceso inmediato y una caché persistente en disco como respaldo. El frontend provider precarga contenido relevante al arranque para operar de forma autónoma si el backoffice no está disponible.

  • Arranque inteligente: precarga inicial de noticias en memoria desde el backoffice.
  • Circuit Breaker: ayuda a reducir bloqueos y activa fallbacks.
  • Reintentos automáticos: para favorecer la consistencia eventual tras fallos.

Flujo de Resolución de Datos

1
Caché en Memoria

Primera consulta a Caffeine para acceso inmediato.

2
Backoffice (si necesario)

Solicitud al backoffice y almacenamiento en caché cuando no existe el dato en memoria.

3
Caché Persistente

Fallback desde disco si la memoria y el backoffice no responden.

Verificación Ligera con ETag (200 bytes)

El endpoint api/news/last compara ETags precalculadas para indicar si hay cambios. Respuestas mínimas: 304 Not Modified (sin transferencia) o 200 OK si hay contenido nuevo. Las ETags se almacenan localmente para reducir la latencia de cálculo.

Capa de caché del Navegador

Service Worker que cachea recursos estáticos (HTML, CSS, JS) y datos esenciales, habilitando funcionamiento offline y reduciendo peticiones repetidas.

Caso de Uso: 30k usuarios × 10 visitas

El sistema reduce el consumo de ancho de banda gracias a que el contenido se sirve frecuentemente desde caché. El cálculo es el siguiente:

Peso primera carga: 60 KB.
Peso cargas posteriores: 200 B.

Para 30 000 usuarios, cada uno realizando 10 visitas:

  • Primera visita: 30 000 × 60 KB = 1 800 000 KB ≈ 1.8 GB
  • Visitas restantes (9 × 200 B): 30 000 × 9 × 200 B = 54 000 000 B ≈ 51.5 MB

Consumo total ≈ 1.85 GB.

En un sistema sin caché estructurada, cada visita costaría 60 KB:

  • 30 000 × 10 × 60 KB = 18 000 000 KB ≈ 18 GB

Reducción: 18 GB → 1.85 GB (≈ −89.7%).

Esto justifica el porcentaje de mejora reportado en las métricas.

Stack Técnico

Spring WebFlux (reactivo) Caffeine Cache Circuit Breaker ETag Service Workers Persistencia en Disco

Resultados y Métricas

−89.7%
Reducción de ancho de banda
En el caso de uso de 30k usuarios
−99.99%
Comunicaciones
Backoffice↔Frontend Provider
Canal libre para administración y métricas
100-150ms
Tiempo de carga web
Primera carga optimizada
−99%
Peso de peticiones posteriores
60 KB → 500 B
<30ms
Carga desde caché
Respuesta con baja latencia

Conclusión

Arquitectura diseñada para el desacoplamiento y la eficiencia: el frontend puede funcionar con contenido cargado previamente y el frontend provider opera de forma independiente del backoffice. Prioriza la resiliencia, simplicidad y reducción de huella energética.

Optimización de Despliegue y Cold-Start

Se mejoraron los tiempos de despliegue y arranque en frío de un servicio Spring Boot mediante técnicas de compilación nativa y automatización de pipelines.

Desafío Técnico

Inicialmente, el proyecto tenía tiempos de despliegue de 5 minutos y arranque en frío de 1,5 minutos, causando excepciones por timeout y una experiencia de despliegue ineficiente.

Solución Implementada

  • Compilación Nativa con GraalVM: Redujo el tiempo de inicio a milisegundos, optimizando el servicio para producción.
  • Compatibilidad Spring Boot: Se identificaron y resolvieron conflictos con Hibernate/ByteBuddy y procesamiento de imágenes, delegando tareas al frontend según los requerimientos.
  • Pipeline CI/CD: Construcción y despliegue automático mediante GitHub Actions, creando imágenes Docker optimizadas y publicándolas en Docker Hub.

Resultados y Métricas

−98%
Tiempo de Despliegue
5 min → 5 s
−78%
Arranque en frío
1,5 min → 20 s

Stack Técnico

Spring Boot Native GraalVM Docker GitHub Actions CI/CD

Referencias

Workflow de CI/CD: GitHub Actions .

Imagen Docker optimizada: Docker Hub .

Dockerfile utilizado: Dockerfile.native-simple .

(Este es uno de los servicios optimizados; ambos tienen configuraciones similares.)

Conclusión

La combinación de compilación nativa, ajustes de compatibilidad y pipeline automatizado permitió despliegues en pocos segundos y arranques en frío eficientes. Esta optimización demuestra capacidad para diseñar soluciones que integran rendimiento, DevOps y arquitectura de servicios de manera más eficiente.

Skills & Technologies

Tecnologías

  • Java 25 (Spring Boot 4, Security, AOP, WebFlux, Data)
  • Concurrencia y Virtual Threads
  • TypeScript (Angular 21) & JavaScript (Node.js)
  • Bases de Datos: PostgreSQL (CQRS Primary/Replica), Redis & MySQL
  • Mensajería y Eventos: Apache Kafka (KRaft)
  • Model Context Protocol (MCP) & APIs de IA
  • DevOps & Infra: Docker, Docker Compose, Nginx & GitHub Actions
  • Observabilidad: Prometheus, Grafana & Micrometer
  • Testing: JUnit 5, Mockito & Testcontainers
  • Compilación: GraalVM (Native compilation)
  • APIs: OpenAPI / Swagger, Scalar
  • PHP (Prestashop modules)

Habilidades Personales

  • Autonomía y Proactividad
  • Desarrollo AI-First
  • Optimización a bajo nivel y latencia
  • Curiosidad y aprendizaje continuo
  • Comunicación técnica
  • Organización y planificación de arquitectura
  • Resolución de problemas complejos

Educación e Idiomas

  • Desarrollo de Aplicaciones Web (DAW)
    IES Domingo Pérez Minik (2024-2026)
    Mención honorífica en expediente en la materia de desarrollo backend.
  • Bachillerato Científico-tecnológico
    IES San Benito (2022-2024)
  • Español - Nativo
  • Inglés - Nivel Intermedio

Let's Connect!

No dudes en contactarme a través de mis redes sociales.