Шина событий
Шина событий
Заголовок раздела «Шина событий»Публикация и подписка на события для наблюдаемости — мониторинга активности среды выполнения и приложения и реакции на неё.
Загрузка
Заголовок раздела «Загрузка»local events = require("events")Подписка на события
Заголовок раздела «Подписка на события»Подписка на события из шины:
-- Подписка на все события заказовlocal sub, err = events.subscribe("orders.*")if err then return nil, errend
-- Подписка на конкретный тип событияlocal sub = events.subscribe("users", "user.created")
-- Подписка на все события системыlocal sub = events.subscribe("payments")
-- Обработка событий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| Параметр | Тип | Описание |
|---|---|---|
system | string | Паттерн системы (поддерживает маски типа “test.*“) |
kind | string | Фильтр типа события (опционально) |
Возвращает: Subscription, error
Отправка событий
Заголовок раздела «Отправка событий»Отправить событие в шину:
-- Событие создания заказаlocal ok, err = events.send("orders", "order.created", "/orders/123", { order_id = "123", customer_id = "456", total = 99.99})if err then return nil, errend
-- Событие регистрации пользователя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")})
-- Событие платежаevents.send("payments", "payment.completed", "/payments/" .. payment.id, { payment_id = payment.id, order_id = payment.order_id, amount = payment.amount, method = payment.method})
-- Отправка без данныхevents.send("system", "heartbeat", "/health")| Параметр | Тип | Описание |
|---|---|---|
system | string | Идентификатор системы |
kind | string | Тип события |
path | string | Путь для маршрутизации |
data | any | Данные события (опционально) |
Возвращает: boolean, error
Методы подписки
Заголовок раздела «Методы подписки»Получение канала
Заголовок раздела «Получение канала»Получить канал для приёма событий:
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Поля события: system, kind, path, data
Закрытие подписки
Заголовок раздела «Закрытие подписки»Отписаться и закрыть канал:
sub:close()Разрешения
Заголовок раздела «Разрешения»| Действие | Ресурс | Описание |
|---|---|---|
events.subscribe | system | Подписка на события системы |
events.send | system | Отправка событий в систему |
| Условие | Kind | Повторяемо |
|---|---|---|
| Пустая система | errors.INVALID | нет |
| Пустой тип | errors.INVALID | нет |
| Пустой путь | errors.INVALID | нет |
| Запрещено политикой | errors.INVALID | нет |
См. Обработка ошибок для работы с ошибками.