Titan ESB clínico

Motor de integración para instituciones de salud

Cada mensaje clínico, hasta el acuse.

Titan mueve HL7 v2, HL7 v3 y FHIR R4 entre los sistemas que ya tiene la institución, y escribe directo en su base —Oracle incluido, sin Instant Client. Sin licencia por interfaz, en su propia infraestructura, y con una respuesta verificable a la única pregunta que importa: ¿el destino lo recibió?

canal · orm-inbound · MLLP 6679 en línea
70.806 msg/s medidos
14,1 ms por lote de 1.000
v2.3 → v2.8 HL7 soportado
12 recursos FHIR R4

Lo que habla hoy

Los estándares que ya expone su HIS.

Un Millennium gestionado se alcanza de dos maneras: HL7 v2 sobre MLLP por el enlace privado, y sus APIs FHIR R4 autenticadas con OAuth2. Titan habla las dos, sin esperar un conector propietario ni pagar por abrirlo.

HL7 v2.3 – v2.8 Parser y serializador completos, con grupos repetitivos y tablas de valores.
ADT · ORU · ORM Admisión y demografía, informes de resultado, órdenes clínicas.
MFN · QBP / RSP Maestros de prestaciones y profesionales, consulta demográfica IHE PDQ.
MLLP sobre TCP Listener y emisor con framing real y evaluación del ACK, no sólo el socket.
FHIR R4 Patient, Practitioner, Encounter, Observation, Condition, DiagnosticReport y siete más.
API FHIR autenticada OAuth2 con client credentials y el perfil backend services de SMART on FHIR.
HL7 v3 / CDA Parser de documentos clínicos estructurados.
XML · JSON · CSV · EDI Transformación entre formatos, con mapeo XSLT y mapeo por esquema.
Transformación JavaScript El mismo tipo de script que ya escribieron sus integradores en Mirth, aislado y con tiempo máximo de ejecución.
Filtro y división por reglas Qué mensajes siguen y cuáles se descartan, y un mensaje compuesto entregado como uno por examen.
Base de datos Escritura directa a tabla o llamada a procedimiento en PostgreSQL, MySQL y SQL Server.
Oracle sin Instant Client Driver TNS propio: escribe en la base del HIS —tabla o procedimiento PL/SQL— sin instalar Instant Client ni OCI en el servidor, que es lo que hoy obliga a pedir una ventana al área de infraestructura.
MSH|^~\&|HIS|CLINICA|TITAN|CLINICA|20260830090000||ORM^O01|MSG-00042|P|2.5.1
PID|0001||11111111-1^^^1|PACIENTE DE PRUEBA^TEST||19750322|F
PV1|1|O|IMAGEN|||||99999-9^MEDICO DE PRUEBA^EJEMPLO
ORC|NW|400-1^IMAGEN||||||20260830090000
OBR|1|400-1^IMAGEN||224^ECOTOMOGRAFIA DOPPLER^IMG

Cómo se opera

Los canales se declaran, no se dibujan.

Cada integración es un archivo versionado. Se revisa como código, se aprueba como código y se despliega con un comando que primero muestra qué va a cambiar.

Reproducible

Plan antes de aplicar

El despliegue enumera qué canales se crean, cuáles cambian y cuáles se detienen, y falla si falta una variable. Nadie descubre una interfaz caída por un cambio que nadie recuerda haber hecho.

Auditable

Git es la fuente de verdad

Quién cambió qué mapeo, cuándo y por qué, con el historial completo. Los mapeos son inmutables por versión: modificar uno obliga a publicar una versión nueva.

Sin bloqueo

Corre en la tenencia de ustedes

En un servidor propio o en una VM de su propia cuenta cloud, al lado de donde termina el enlace con el HIS. No operamos ninguna nube donde aterricen sus datos: el proveedor no tiene acceso a información de pacientes en ningún momento.

Así se ve un canal por dentro. Todo esto es declaración: lo único que se escribe a mano es la transformación que el flujo realmente necesite.

# Sólo los informes de imagenología de estos exámenes siguen por el canal.
- type: filter
  config:
    match: all
    conditions:
      - { field: "$.mensaje",             operator: equals,    value: "ORU^R01" }
      - { field: "$.examenes.0.codigo", operator: in,        value: ["224", "581"] }
      - { field: "$.paciente.rut",      operator: not_empty }

# Lo que no cumple se registra como filtrado, no como falla del canal.

La diferencia operativa

Un acuse no es una entrega.

La mayoría de los incidentes de integración no son mensajes mal formados: son mensajes que se dieron por entregados. Titan separa las dos cosas y las registra por separado.

Recepción

El mensaje entra, se valida el framing y se responde el ACK que el emisor espera. Queda persistido antes de responder.

Deduplicación

Un reenvío del mismo mensaje dentro de la ventana configurada se descarta con acuse, sin efectos secundarios: no se duplica la orden.

Entrega

La salida pasa por un outbox con reintentos y backoff. Mientras no haya confirmación del destino, el estado es "en cola", nunca "entregado".

Falla

Agotados los reintentos, el mensaje va a una cola de fallidos visible, con el motivo del destino. Se reprocesa desde ahí, no se pierde.

Consulta

Cada lote recibe un identificador con el que el sistema emisor puede preguntar en qué estado quedó cada mensaje que envió.


La consola de operación

El recorrido del mensaje, etapa por etapa.

Cuando una orden no llega, la pregunta no es si el motor está arriba: es dónde se detuvo. Titan guarda cada etapa por separado —origen, cada transformador, cada destino— y las muestra con su duración y el motivo de la falla. Sin entrar por SSH a leer un log.

/admin/mensajes sesión: operador · toda acción queda auditada
MSG-00042 orm-inbound · 30/08 09:00:04 · ORM^O01 Fallido

Recorrido

  1. mllp_listener origen 2 ms
  2. field_mapper transformación 6 ms
  3. js_transform transformación 11 ms
  4. database · his-db destino 34 ms
  5. http · fhir.clinica.cl destino 1.204 ms
    502 desde el destino — "upstream connect error"

Entregas del lote

database · his-db Entregada 1 intento
mllp · pacs-imagen Entregada 1 intento
http · fhir.clinica.cl No entregada 5 intentos Reprocesar · Descartar

El contenido del mensaje está detrás de un clic explícito y sólo para quien tiene el permiso: puede traer datos del paciente, y abrirlo queda registrado con nombre, hora y dirección.

Dos entregas llegaron y una no. El mensaje no está "fallido" en abstracto: falló un destino, por una razón concreta, y se reprocesa sin reenviar el original desde el HIS.

/admin/canales últimas 24 horas
Canal Origen Recibidos Entregados Fallidos En cola No entregados
mfn-prestaciones mllp_listener:6681 0 0 0 0 0
orm-inbound mllp_listener:6679 4.812 4.809 3 2 1
oru-resultados mllp_listener:6680 9.104 9.104 0 0 0
adt-demografia mllp_listener:6678 21.446 21.446 0 0 0

El canal detenido va primero, después el que tiene algo sin entregar, y al final los sanos. Un panel donde hay que buscar el problema no sirve a las tres de la mañana.

Permisos

Mirar no es actuar

Tres roles: quien consulta el estado y el recorrido, quien además ve el contenido y reprocesa, y quien inicia o detiene canales. El permiso se verifica en el servidor, no escondiendo el botón.

Auditoría

Quién abrió qué

Ver el contenido de un mensaje, reprocesar, descartar, detener un canal: cada acción queda con usuario, hora y dirección. El acceso a datos clínicos se distingue a simple vista, que es lo que un auditor viene a buscar.

Alertas

Avisa al caer, no cada minuto

Canal detenido, canal sin mensajes, entregas sin entregar sobre un umbral, tasa de error sobre un porcentaje. Se notifica en las transiciones: un canal caído tres horas manda un aviso al caer y otro al volver, no ciento ochenta.


Seguridad de los datos clínicos

El transporte no se puede debilitar por descuido.

Todo lo que sale de un canal lleva datos de pacientes. Las decisiones de seguridad están tomadas en el producto, no delegadas a que cada integración se configure bien.

TLS verificado

Cada salida HTTPS valida la cadena del certificado y el nombre del servidor, con TLS 1.2 como mínimo. No existe una opción para desactivarlo: pedirla devuelve un error que indica qué configurar en su lugar.

CA propia y mTLS

Para endpoints internos con autoridad certificadora institucional se declara el bundle, y para autenticación mutua el certificado de cliente. Nadie necesita apagar la verificación para que un enlace privado funcione, que es como suele abrirse este agujero.

Credenciales

Los secretos se leen de variables de entorno, no del archivo del canal, y los tokens viven sólo en memoria: no se escriben a disco, ni a log, ni aparecen en el detalle de un error.

HL7 sobre MLLP

MLLP es un protocolo sin cifrado propio, en Titan y en cualquier otro motor. Va dentro del enlace privado hacia el HIS — VPN o enlace dedicado — que es como se opera con un Millennium gestionado.

Trazabilidad

Cada mensaje deja registro de qué canal lo procesó, cuándo y con qué resultado, con la retención que defina la institución.


Frente a un motor licenciado por interfaz

Dónde conviene cada uno.

La comparación honesta importa más que la favorable: si la institución necesita mañana un conector empaquetado para un EHR comercial, hay productos que lo traen hecho y Titan no.

Criterio Motor licenciado por interfaz Titan
Costo al agregar una integración Licencia por interfaz o por conector Sin costo por interfaz adicional
Dónde viven los datos clínicos Nube del proveedor u on-premise según el contrato Siempre en la infraestructura de la institución
Configuración de canales Consola propietaria; el cambio vive dentro del producto Archivos versionados en git, con revisión previa
Confirmación de entrega Variable según el adaptador Estado por lote, con cola de fallidos consultable
Acceso al código Cerrado Auditable por el equipo de la institución
Escribir en la base del HIS Driver del proveedor: JDBC u Oracle Instant Client instalado en el servidor Oracle, PostgreSQL, MySQL y SQL Server; Oracle con driver propio, sin cliente que instalar
Conectores empaquetados para EHR comerciales Incluidos para las suites más difundidas No; la integración se construye sobre HL7 v2 y FHIR
Soporte con SLA corporativo Estructura global del proveedor Equipo directo, acuerdo a definir

Próximo paso

Un flujo real, seis semanas, sin compromiso de reemplazo.

La forma seria de evaluar un motor de integración no es una demo: es un flujo productivo corriendo en paralelo al actual, con tráfico real y resultados comparables mensaje a mensaje.

Semana 1 – 2

Elegimos un flujo acotado y de bajo riesgo. Se declara el canal y se levanta el ambiente dentro del perímetro de la institución.

Semana 3 – 4

Corre en paralelo al motor actual, con tráfico real espejado. Se comparan mensajes procesados, latencia y fallas.

Semana 5 – 6

Informe con resultados medidos, no estimados: qué se entregó, qué falló y qué costaría llevar el resto de las interfaces.

Coordinar el piloto →