Ir al contenido

Cola de Mensajes

Publicar y consumir mensajes de colas distribuidas. Soporta multiples backends incluyendo RabbitMQ y otros brokers compatibles con AMQP.

Para configuración de colas, consulte Cola.

local queue = require("queue")

Enviar mensajes a una cola por ID:

local ok, err = queue.publish("app:tasks", {
action = "send_email",
user_id = 456,
template = "welcome"
})
if err then
return nil, err
end
ParámetroTipoDescripción
queue_idstringIdentificador de cola (formato: “namespace:name”)
dataanyDatos del mensaje (tablas, strings, numeros, booleanos)
headerstableCabeceras de mensaje opcionales

Devuelve: boolean, error

Las cabeceras permiten enrutamiento, prioridad y trazabilidad:

queue.publish("app:notifications", {
type = "order_shipped",
order_id = order.id
}, {
priority = "high",
correlation_id = request_id
})

Dentro de un consumidor de cola, acceder al mensaje actual:

local msg, err = queue.message()
if err then
return nil, err
end
local msg_id = msg:id()
local priority = msg:header("priority")
local all_headers = msg:headers()

Devuelve: Message, error

Solo disponible cuando se procesan mensajes de cola en contexto de consumidor.

MétodoDevuelveDescripción
id()string, errorIdentificador único de mensaje
header(key)any, errorValor de cabecera individual (nil si falta)
headers()table, errorTodas las cabeceras del mensaje
ack()boolean, errorConfirmar procesamiento (single-shot)
nack()boolean, errorSeñalar fallo para reentrega o dead-letter (single-shot)

El runtime hace auto-ack al éxito del handler y auto-nack al error del handler. Llama a ack/nack solo para confirmar anticipadamente.

local stats, err = queue.info("app:tasks")
-- stats puede contener: message_count, consumer_count, ready (depende del driver)

Devuelve: table, error

Los consumidores de cola se definen como puntos de entrada que reciben el payload directamente:

entries:
- kind: queue.consumer
id: email_worker
queue: app:emails
method: handle_email
function handle_email(payload)
local msg = queue.message()
logger:info("Processing", {
message_id = msg:id(),
to = payload.to
})
local ok, err = email.send(payload.to, payload.template, payload.data)
if err then
return nil, err -- El mensaje sera reencolado o enviado a dead-letter
end
end

Las operaciones de cola estan sujetas a evaluacion de politica de seguridad.

AccionRecursoDescripción
queue.publish-Permiso general para publicar mensajes
queue.publish.queueID de ColaPublicar a cola especifica

Ambos permisos se verifican: primero el permiso general, luego el específico de cola.

CondiciónTipoReintentable
ID de cola vacioerrors.INVALIDno
Datos de mensaje vacioserrors.INVALIDno
Sin contexto de entregaerrors.INVALIDno
Publicacion no permitidaerrors.INVALIDno
Publicacion fallidaerrors.INTERNALno

Consulte Manejo de Errores para trabajar con errores.