Event Bus
Publique e inscreva-se em eventos em toda sua aplicação para arquiteturas orientadas a eventos.
Carregamento
local events = require("events")
Inscrevendo-se em Eventos
Inscreva-se em eventos do event bus:
-- Inscreva-se em todos os eventos de pedidos
local sub, err = events.subscribe("orders.*")
if err then
return nil, err
end
-- Inscreva-se em tipo de evento específico
local sub = events.subscribe("users", "user.created")
-- Inscrever em todos os eventos de um sistema
local sub = events.subscribe("payments")
-- Processar eventos
local ch = sub:channel()
while true do
local evt, ok = ch:receive()
if not ok then break end
logger:info("Received event", {
system = evt.system,
kind = evt.kind,
path = evt.path
})
handle_event(evt)
end
| Parâmetro | Tipo | Descrição |
|---|---|---|
system |
string | Padrão do sistema (suporta wildcards como "test.*") |
kind |
string | Filtro de tipo de evento (opcional) |
Retorna: Subscription, error
Enviando Eventos
Enviar um evento para o event bus:
-- Enviar evento de pedido criado
local ok, err = events.send("orders", "order.created", "/orders/123", {
order_id = "123",
customer_id = "456",
total = 99.99
})
if err then
return nil, err
end
-- Enviar evento de usuário
events.send("users", "user.registered", "/users/" .. user.id, {
user_id = user.id,
email = user.email,
created_at = time.now():format("2006-01-02T15:04:05Z07:00")
})
-- Enviar evento de pagamento
events.send("payments", "payment.completed", "/payments/" .. payment.id, {
payment_id = payment.id,
order_id = payment.order_id,
amount = payment.amount,
method = payment.method
})
-- Enviar sem dados
events.send("system", "heartbeat", "/health")
| Parâmetro | Tipo | Descrição |
|---|---|---|
system |
string | Identificador do sistema |
kind |
string | Tipo do evento |
path |
string | Caminho do evento para roteamento |
data |
any | Payload do evento (opcional) |
Retorna: boolean, error
Métodos de Subscription
Obtendo o Channel
Obter o channel para receber eventos:
local ch = sub:channel()
local evt, ok = ch:receive()
if ok then
print("System:", evt.system)
print("Kind:", evt.kind)
print("Path:", evt.path)
print("Data:", json.encode(evt.data))
end
Campos do evento: system, kind, path, data
Fechando Subscription
Cancelar inscrição e fechar o channel:
sub:close()
Permissões
| Ação | Recurso | Descrição |
|---|---|---|
events.subscribe |
sistema | Inscrever-se em eventos de um sistema |
events.send |
sistema | Enviar eventos para um sistema |
Erros
| Condição | Tipo | Retentável |
|---|---|---|
| Sistema vazio | errors.INVALID |
não |
| Tipo vazio | errors.INVALID |
não |
| Caminho vazio | errors.INVALID |
não |
| Política negou | errors.INVALID |
não |
Veja Error Handling para trabalhar com erros.