이벤트 버스
이벤트 기반 아키텍처를 위해 애플리케이션 전체에서 이벤트를 발행하고 구독합니다.
로딩
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 |
아니오 |
에러 처리는 에러 처리를 참조하세요.