事件总线
发布和订阅事件,用于观测——监控运行时和应用活动并对其做出响应。
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 | 向某系统发送事件 |
| 条件 | 类型 | 可重试 |
|---|---|---|
| 系统为空 | errors.INVALID | 否 |
| 类型为空 | errors.INVALID | 否 |
| 路径为空 | errors.INVALID | 否 |
| 策略拒绝 | errors.INVALID | 否 |
错误处理参见错误处理。