Cómo unifiqué 10 sistemas legacy hospitalarios sin parar las operaciones
Una arquitectura orientada a eventos para sincronización de datos clínicos en tiempo real — las decisiones técnicas que tomé y por qué.
Por Ramón Meléndez
Arquitectura Simplificada
El contexto real
El entorno era uno de esos que te hacen entender por qué la ingeniería de sistemas críticos no se parece en nada al desarrollo de aplicaciones estándar. Una red hospitalaria con más de diez sistemas legacy en producción: admisión, laboratorio, radiología, farmacia, ERP. Cada uno comprado en un año diferente, cada uno con su proveedor, su esquema de datos y su forma particular de identificar a un paciente.
El problema real no era técnico en su superficie — era clínico. Un médico en urgencias necesita ver el resultado del laboratorio de su paciente. Pero ese resultado vive en el sistema de laboratorio, el médico trabaja en el sistema de historia clínica, y esos dos sistemas nunca se diseñaron para comunicarse. El médico espera. El paciente espera. Y mientras espera, se toman decisiones con información incompleta.
La restricción que definió toda la arquitectura fue esta: cero downtime. Un hospital no se apaga para hacer una migración. Todo tenía que ocurrir en paralelo con el sistema en producción — integraciones en caliente, sin interrumpir ni una sola consulta.
El tercer problema, que solo se revela cuando empiezas a auditar los datos fuente: el mismo paciente tiene identificadores distintos en cada sistema. Lo que admisión llama "paciente 00145" es "PA-2891" en el laboratorio. La normalización semántica resultó tan compleja como cualquier problema técnico de la arquitectura.
Las decisiones de arquitectura
Por qué orientada a eventos y no punto a punto
Con diez sistemas, las integraciones punto a punto generan un grafo de dependencias que escala cuadráticamente. Sistema A necesita hablar con B, C y D. Sistema B necesita hablar con A, C y D. Un fallo en cualquier punto puede interrumpir la cadena entera. Y cuando el décimo sistema se integra, ya tienes 45 conexiones que mantener.
La arquitectura orientada a eventos invierte esa lógica: cada sistema publica lo que ocurre, sin saber quién lo escucha. Si un sistema downstream cae, el productor no se entera — sigue publicando. El consumidor retoma cuando vuelve. El núcleo del hospital sigue operando independientemente de los fallos periféricos.
Por qué Apache Kafka específicamente
Kafka no es un message broker genérico. Su diferencia crítica para este proyecto fue la retención de mensajes y la capacidad de replay. En un entorno hospitalario, perder un evento — un resultado de laboratorio, una admisión — no es un bug técnico. Es un riesgo clínico. Si el sistema de historia clínica cae 15 minutos, cuando vuelve tiene que poder procesar todo lo que ocurrió en esos 15 minutos, en orden y sin pérdidas. Kafka garantiza eso.
El throughput de miles de eventos por segundo con latencia predecible, y la capacidad de reprocesar el historial completo de eventos para auditorías, fueron criterios determinantes. En contextos médicos, la trazabilidad no es una funcionalidad — es un requisito legal.
La capa de normalización semántica
El problema más difícil no fue técnico sino semántico. Diseñé una capa de normalización que actúa como traductor universal: cada sistema fuente publica en su formato nativo, la capa ingiere ese evento, aplica las reglas de mapeo correspondientes y lo emite en un esquema canónico que todos los consumidores entienden. Un "paciente" tiene siempre el mismo identificador en el esquema canónico, sin importar de qué sistema llegó el evento. Sin esta capa, solo estaríamos sincronizando datos incompatibles a alta velocidad.
Seguridad en tránsito y en reposo
Datos clínicos bajo estándares HIPAA: JWT para autenticación entre servicios, AES-256 para datos en reposo, TLS en todos los canales de comunicación. Cada evento en Kafka lleva metadata de seguridad que permite reconstruir quién accedió a qué dato, cuándo y desde qué servicio. El registro de auditoría es inmutable — una vez escrito, no puede modificarse.
Lo que se logró
La sincronización quedó en menos de 100 milisegundos. Para ponerlo en contexto clínico: antes de la integración, un médico tardaba entre 3 y 8 minutos en localizar el resultado de laboratorio de su paciente porque tenía que cambiar de sistema, buscar con otro identificador y esperar. Ahora el resultado aparece en la historia clínica mientras el médico está con el paciente. En urgencias, esa diferencia tiene implicaciones directas en la calidad de las decisiones clínicas.
El sistema alcanzó el 99.9% de disponibilidad en el primer año de operación — el SLA comprometido. Las discrepancias de datos entre sistemas quedaron eliminadas por completo: el mismo paciente tiene el mismo historial en todos los puntos de atención de la red.
El resultado arquitectónico más valioso a largo plazo: la plataforma escala horizontalmente. Integrar un nuevo hospital a la red no requiere reescribir código base — requiere configurar los adaptadores del sistema fuente y conectarlos al bus de eventos existente. La arquitectura absorbe el crecimiento de la red sin crecimiento proporcional de complejidad.
Lo que aprendí
1. La resistencia técnica más difícil no viene del código, viene de las personas.
Los equipos que llevan años manteniendo un sistema legacy lo tratan como territorio propio. Proponer una integración activa su modo defensivo: miedo a que algo falle, a que alguien externo toque "su" sistema, a perder control. Gestionar esa dinámica requirió más reuniones, más documentación y más paciencia que cualquier problema técnico que enfrentamos. La arquitectura más elegante fracasa si los equipos no la adoptan. Aprendí que el cambio más resistente no es el técnico.
2. Los datos nunca están tan limpios como el cliente cree.
Antes de diseñar el esquema canónico, auditamos los datos de cada sistema fuente. Encontramos pacientes duplicados, resultados de laboratorio sin identificador de médico, admisiones con timestamps inconsistentes entre sistemas que deberían estar sincronizados. El 40% del tiempo total del proyecto fue limpieza, mapeo y validación — no desarrollo de la arquitectura de eventos. Si no lo hubiera previsto en la planificación, el sistema habría sincronizado datos inconsistentes a velocidad de Kafka. Datos limpios primero, velocidad después.
3. En sistemas críticos, el diseño para el fallo importa más que el diseño para el éxito.
¿Qué pasa si Kafka cae? ¿Si un microservicio no responde en el tiempo esperado? ¿Si la red entre hospitales se interrumpe? Cada componente tiene un modo degradado definido: capacidad de operar de forma autónoma, con sincronización diferida, sin comprometer la seguridad del paciente. Un sistema que solo funciona cuando todo funciona no es un sistema para entornos hospitalarios. El diseño para el fallo no es un extra — es el núcleo de la ingeniería en sistemas críticos.
Stack tecnológico
Java + Spring Boot — Ecosistema maduro con soporte empresarial y trayectoria probada en entornos críticos. En hospitales no puedes arriesgarte con tecnologías sin track record.
Apache Kafka — Message broker elegido por su durabilidad de mensajes y capacidad de replay. Perder un evento en un entorno clínico no es aceptable — Kafka garantiza que no ocurra.
Docker — Containerización para deploys consistentes y aislamiento de servicios. Cada microservicio vive en su propio contenedor, con sus dependencias declaradas explícitamente.
AES-256 + JWT + TLS — Estándares de seguridad exigidos por HIPAA para datos clínicos. No son opcionales — son el punto de partida.
¿Tu institución tiene el mismo problema?
Los sistemas legacy no van a desaparecer solos. La pregunta es si tus datos clínicos fluyen en tiempo real o si tus médicos siguen tomando decisiones con información incompleta.
Si quieres analizar tu arquitectura actual y ver qué es posible, hablemos. No hay compromiso — solo una conversación técnica.
