Saltar al contenido principal

Esquema de Base de Datos

Este documento describe cada tabla en el esquema de base de datos de MIH, incluyendo definiciones de columnas, restricciones, índices y notas de uso.


Visión General

MIH usa cinco tablas, todas con el prefijo local_integrationhub_:

TablaPropósitoFilas (típico)
svcServicios externos registrados1–50
cbEstado del circuit breaker (una fila por servicio)Igual que svc
logLog de peticiones/respuestas (auto-purgado)Hasta max_log_entries
rulesReglas del Event Bridge1–500
dlqDead Letter Queue para eventos fallidos0–∞ (limpieza manual)

local_integrationhub_svc — Servicios

ColumnaTipoNulablePor DefectoDescripción
idBIGINTNoautoClave primaria
nameVARCHAR(255)NoSlug único. Usado como clave de búsqueda en mih::request(). Sin espacios.
typeVARCHAR(10)NorestTipo de transporte: rest, amqp, o soap
base_urlVARCHAR(1333)NoURL base para REST/SOAP, o cadena de conexión AMQP completa
auth_typeVARCHAR(20)nullMétodo de autenticación: bearer o apikey
auth_tokenLONGTEXTnullValor del token o API key
timeoutBIGINTNo5Timeout de petición en segundos
max_retriesBIGINTNo3Intentos máximos de reintento tras el primer fallo
retry_backoffBIGINTNo1Backoff inicial en segundos (se duplica en cada reintento)
cb_failure_thresholdBIGINTNo5Fallos consecutivos antes de abrir el circuito
cb_cooldownBIGINTNo30Segundos antes de intentar recuperación (HALFOPEN)
response_queueVARCHAR(255)nullNombre de cola AMQP para consumo de respuestas entrantes
enabledTINYINT(1)No11 = activo, 0 = desactivado
timecreatedBIGINTNoTimestamp Unix de creación
timemodifiedBIGINTNoTimestamp Unix de última modificación

local_integrationhub_cb — Circuit Breaker

Una fila por servicio. Rastrea el estado del circuit breaker.

ColumnaTipoDescripción
idBIGINTClave primaria
serviceidBIGINTFK → local_integrationhub_svc.id
stateVARCHAR(10)Estado actual: closed, open, o halfopen
failure_countBIGINTContador de fallos consecutivos. Se resetea a 0 en éxito.
last_failureBIGINTTimestamp Unix del fallo más reciente
timemodifiedBIGINTTimestamp Unix del último cambio de estado

local_integrationhub_log — Log de Peticiones

Registra cada petición saliente (y entrante AMQP).

ColumnaTipoDescripción
idBIGINTClave primaria
serviceidBIGINTFK → local_integrationhub_svc.id
endpointVARCHAR(1333)Ruta de endpoint llamada
http_methodVARCHAR(10)Método HTTP usado
http_statusBIGINTCódigo de respuesta HTTP. null para AMQP.
latency_msBIGINTTiempo de respuesta en milisegundos
attempt_countBIGINTTotal de intentos realizados (incluyendo reintentos)
successTINYINT(1)1 = éxito, 0 = fallo
error_messageLONGTEXTDescripción del error si falló
directionVARCHAR(10)outbound (MIH → servicio) o inbound (servicio → MIH)
timecreatedBIGINTTimestamp Unix de la petición

Auto-Purga

Después de cada INSERT, la API MIH verifica el total de filas. Si supera max_log_entries (por defecto: 500), se eliminan las filas más antiguas.


local_integrationhub_rules — Reglas del Event Bridge

Cada fila mapea un evento de Moodle a una llamada de servicio.

ColumnaTipoDescripción
idBIGINTClave primaria
eventnameVARCHAR(255)Nombre completo de clase PHP del evento de Moodle
serviceidBIGINTFK → local_integrationhub_svc.id
endpointVARCHAR(255)Override de endpoint. Para AMQP: routing key. Para SOAP: nombre del método.
http_methodVARCHAR(10)Método HTTP para servicios REST
payload_templateLONGTEXTTemplate JSON con placeholders {{variable}}
enabledTINYINT(1)1 = activo, 0 = desactivado
timecreatedBIGINTTimestamp Unix de creación
timemodifiedBIGINTTimestamp Unix de última modificación

local_integrationhub_dlq — Dead Letter Queue

Almacena eventos que fallaron en entregarse después de todos los intentos de reintento.

ColumnaTipoDescripción
idBIGINTClave primaria
eventnameVARCHAR(255)Nombre de clase del evento que falló
serviceidBIGINTID del servicio destino
payloadLONGTEXTPayload JSON-encoded que se intentó
error_messageLONGTEXTÚltimo mensaje de error del intento fallido
timecreatedBIGINTTimestamp Unix cuando el evento fue movido a DLQ

Consultas Útiles

Servicios con circuitos abiertos

SELECT s.name, cb.state, cb.failure_count, cb.last_failure
FROM local_integrationhub_svc s
JOIN local_integrationhub_cb cb ON cb.serviceid = s.id
WHERE cb.state != 'closed'
ORDER BY cb.last_failure DESC;

Tasa de errores por servicio (últimas 24h)

SELECT
s.name,
COUNT(*) AS total,
SUM(CASE WHEN l.success = 0 THEN 1 ELSE 0 END) AS errores,
AVG(l.latency_ms) AS latencia_prom_ms
FROM local_integrationhub_log l
JOIN local_integrationhub_svc s ON s.id = l.serviceid
WHERE l.timecreated > UNIX_TIMESTAMP() - 86400
GROUP BY s.id, s.name
ORDER BY errores DESC;

Entradas DLQ por servicio

SELECT s.name, COUNT(*) AS dlq_count, MAX(d.timecreated) AS ultimo_fallo
FROM local_integrationhub_dlq d
JOIN local_integrationhub_svc s ON s.id = d.serviceid
GROUP BY s.id, s.name
ORDER BY dlq_count DESC;