콘텐츠로 이동

이벤트 버스

관측성을 위해 이벤트를 발행하고 구독합니다 — 런타임과 애플리케이션 활동을 모니터링하고 반응합니다.

이벤트 버스는 관찰 목적으로만 사용하세요: 모니터링, 로깅, 메트릭, 반응형 사이드 이펙트. 이것은 최선 노력 발행/구독 채널이지, 신뢰할 수 있는 전송이 아닙니다 — 비즈니스 로직을 구축하거나 보장된 전달에 의존하지 마세요. 비즈니스 크리티컬 메시징은 프로세스 메시징(`process.send`), 채널, 또는 [메시지 큐](lua/storage/queue.md)를 사용하세요.
local events = require("events")

이벤트 버스에서 이벤트를 구독합니다:

-- 모든 주문 이벤트 구독
local sub, err = events.subscribe("orders.*")
if err then
return nil, err
end
-- 특정 이벤트 종류 구독
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
파라미터타입설명
systemstring시스템 패턴 (“test.*“와 같은 와일드카드 지원)
kindstring이벤트 종류 필터 (선택적)

반환: 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, err
end
-- 사용자 이벤트 전송
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")
파라미터타입설명
systemstring시스템 식별자
kindstring이벤트 종류/타입
pathstring라우팅을 위한 이벤트 경로
dataany이벤트 페이로드 (선택적)

반환: 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.subscribesystem시스템에서 이벤트 구독
events.sendsystem시스템에 이벤트 전송
조건종류재시도 가능
빈 systemerrors.INVALID아니오
빈 kinderrors.INVALID아니오
빈 patherrors.INVALID아니오
정책 거부됨errors.INVALID아니오

에러 처리는 에러 처리를 참조하세요.