이벤트 버스

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

이벤트 버스는 관찰 목적으로만 사용하세요: 모니터링, 로깅, 메트릭, 반응형 사이드 이펙트. 이것은 최선 노력 발행/구독 채널이지, 신뢰할 수 있는 전송이 아닙니다 — 비즈니스 로직을 구축하거나 보장된 전달에 의존하지 마세요. 비즈니스 크리티컬 메시징은 프로세스 메시징(`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
파라미터 타입 설명
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, 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")
파라미터 타입 설명
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 시스템에 이벤트 전송

에러

조건 종류 재시도 가능
빈 system errors.INVALID 아니오
빈 kind errors.INVALID 아니오
빈 path errors.INVALID 아니오
정책 거부됨 errors.INVALID 아니오

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