RESP-compatible · Rust · sharding actor

Cache clínico durable,
no otro Redis.

Klinex habla con clientes Redis/Valkey, pero no hereda su modelo. Está pensado para estado clínico estructurado: tipos nativos, TTL semántico, índices de dominio, invalidación por evento y auditoría append-only.

Posicionamiento

Una pieza, un trabajo

Klinex se ubica entre las capas de integración —API gateways, routers HL7/FHIR, motores conversacionales— y los servicios que consumen estado clínico. Hace una cosa y la hace con semántica de dominio.

Lo que no es

  • Un caché efímero de propósito general — para eso está Valkey
  • Un message broker — eso lo maneja RabbitMQ
  • Una base transaccional clínica — la fuente de verdad sigue siendo Oracle/PostgreSQL
  • Compliance por sí mismo — el audit trail lo apoya, no lo garantiza

Lo que es

  • Un cache durable con tipos clínicos de primera clase
  • Invalidación orientada a eventos, no a expiración por tiempo
  • Auditoría append-only encadenada por hash, en el camino de escritura
  • Compatibilidad RESP para adopción rápida, semántica propia para salud
Diferencia estratégica

Compatible con Redis, mejor donde Redis se vuelve frágil

No competimos por ser el GET/SET más genérico. El valor está en alta cardinalidad, claves compuestas, estado durable, auditoría y consultas de dominio.

Redis / Valkey
clave opacaExcelente para cache efímero y estructuras simples.
TTL numéricoExpira por segundos, no por intención clínica.
cluster slotsDistribución rápida, sin consenso fuerte por operación.
observabilidadMétricas de sistema; poca historia semántica del dato.
Klinex
tipo + índiceHL7, FHIR, pacientes, sesiones y slots se consultan por campos reales.
TTL semánticoAlta, confirmación, cambio de estado o cierre de sesión invalidan el dato.
Raft futuroEl diseño apunta a quorum, failover y lecturas con consistencia configurable.
audit trailCada escritura clínica deja huella encadenada por hash.
Tipos nativos

Estado clínico, no blobs

Cada tipo determina qué se indexa, qué eventos lo invalidan y cómo se interpreta su estado semántico. Diseñado para cualquier clínica u hospital: el identificador de paciente admite RUT, MRN, identificador FHIR, DNI extranjero o pasaporte.

PACIENTE

Identificado por RUT, MRN, FHIR, DNI o pasaporte. Indexado para búsqueda directa.

SESION

Máquina de estados conversacional para motores LLM y WhatsApp.

HL7_MSG

Mensaje HL7 v2 crudo, con headers MSH, PID y PV1 indexados.

FHIR_RES

Recurso FHIR R4, consultable por resourceType e identifier.

SLOT_AGENDA

Unidad de agendamiento con transiciones de estado explícitas.

ALERTA

Alerta clínica con severidad; expira al confirmarse el evento ligado.

Índice actual y siguiente salto

Del índice invertido al lookup compuesto

Hoy el core mantiene un índice invertido por TIPO|campo=valor. Para superar a Redis en cargas tipo Momentic, el siguiente paso es un índice compuesto durable: resolver primero el mejor estado/version/commit disponible y recién después leer las entradas exactas.

actual

Índice invertido

HL7_MSG|paciente_id=... apunta a claves vivas en el shard dueño.

próximo

Clave compuesta

tenant + tipo + branch + version + timestamp reduce búsquedas masivas.

próximo

Vista materializada

Precalcular timestamps/estados disponibles evita escanear la tabla grande.

próximo

Compactación TTL

Extender vida por reinserción y deduplicar en background, sin UPDATE caliente.

Lectura objetivo: buscar por clave clínica compuesta, elegir la versión válida más cercana y devolver el payload sin depender de un scan ni de un TTL ciego.

TTL semántico

El tiempo es una condición, no un número

Un mensaje de admisión no "expira en 3600 segundos": deja de ser válido cuando llega el alta, o cuando el slot pasa a CONFIRMADO. Klinex modela la intención clínica real.

HASTA_EVENTO <evento>Se invalida cuando ocurre el evento publicado.
HASTA_ESTADO <tipo> <estado>Se invalida cuando el recurso alcanza ese estado.
HASTA_CONFIRMACIONSe invalida con un ACK explícito.
VENTANA_SESIONLigado al turno conversacional activo.
HASTA_TIMEOUT <seg>Fallback numérico, solo como red de seguridad.
Superficie de query

Un protocolo legible

Texto sobre TCP para control y depuración; binario con framing por longitud para producción. La identidad es obligatoria: sin actor no hay auditoría, y sin auditoría no hay escritura.

klinex · 127.0.0.1:6400
KLINEX 0.1 listo. IDENT <actor> <servicio> para habilitar escrituras. > IDENT dr.house remi OK identificado > SET HL7_MSG hl7:1 MSH|^~\&|REMI|...|ADT^A01|... TTL=HASTA_EVENTO alta_paciente OK > QUERY HL7_MSG WHERE paciente_id=12345678-9 COUNT 1 HL7_MSG hl7:1 > PUBLISH alta_paciente # el evento invalida la clave OK invalidadas=1 > GET hl7:1 NIL > AUDIT hl7:1 AUDIT hl7:1 COUNT 2 1782571370921 SET HL7_MSG actor=dr.house hash=b4662561… 1782571371436 INVALIDATE HL7_MSG actor=dr.house anterior=b4662561…
Garantías

Auditable por diseño

🔗

Cadena por hash

Cada SET, DELETE e INVALIDATE encadena su hash con el de la operación previa. Alterar un registro pasado invalida todos los posteriores.

📡

Invalidación por evento

Los sistemas externos publican eventos por el canal pub. Sin polling, sin escaneos lazy de expiración sobre tipos clínicos.

🧩

Sharding sin locks

Un thread por shard, modelo actor sobre Tokio. El estado no se comparte: se accede por mensajes. El log vive en un shard aparte.

🦀

Rust, sin sorpresas

Sin GC, sin unsafe salvo justificación. Binario estático musl de ~1.6 MB, listo para desplegar en cualquier host Linux.