Event Driven Architecture

ClassBinu·2024년 5월 14일

F-lab

목록 보기
20/65

정의

이벤트를 생성, 전달, 반응하는 시스템을 구성

주요 구성 요소

이벤트 프로듀서

이벤트를 생성하고 발생하는 역할
예를 들어 사용자가 버튼을 클릭하면 버튼 클릭 이벤트 생성

이벤트 브로커

이벤트를 전달하고 관리하는 중개자 역할
이벤트 버스, 메시지 큐, 스트리밍 플랫폼 등
Kafka, RabbitMQ

이벤트 컨슈머

이벤트 구독하고 처리하는 역할
이벤트가 발생하면 이를 받아서 필요한 작업을 수행

특징

비동기 처리

이벤트를 생성 후 바로 처리되지 않고 큐에 저장되며, 이벤트 컨슈머가 이를 비동기적으로 처리

유연성과 확장성

새로운 이벤트 프로듀서나 컨슈머를 쉽게 추가할 수 있어 시스템 확장에 유리
특저 이엡느테 대한 로직을 독립 처리 가능해서 격리성 증가

느슨한 결합

이벤트 프로듀서와 컨슈머는 직접 열결되지 않고 이벤트 브로커를 통해 간접적으로 통신

실시간 데이터 처리

이벤트 vs 함수 호출

이벤트의 의해 트리거 vs 명시적이 순서에 따라 순차적 실행
비동기적 처리 vs 동기적 처리
느슨한 결합 vs 긴밀한 결합

느슨한 결합은 컨슈머는 프로듀서를 정확히 몰라도 브로커를 통해 동작이 가능하지만,
함수 호출 방식에서 호출자는 함수의 인터페이스와 동작을 정확히 알고 있어야 한다.

예시 코드

브로커

이벤트 등록, 발행, 구독 역할

type EventHandler = (data: any) => void;

class EventBroker {
    private events: Map<string, EventHandler[]> = new Map();

    // 이벤트 핸들러 등록
    public on(event: string, handler: EventHandler): void {
        if (!this.events.has(event)) {
            this.events.set(event, []);
        }
        this.events.get(event)?.push(handler);
    }

    // 이벤트 발행
    public emit(event: string, data: any): void {
        const handlers = this.events.get(event);
        if (handlers) {
            handlers.forEach(handler => handler(data));
        }
    }
}

프로듀서

이벤트 생성, 브로커를 통해 발행

class EventProducer {
    constructor(private broker: EventBroker) {}

    // 이벤트 생성 및 발행
    public produceEvent(): void {
        const data = { message: 'Hello, World!' };
        console.log('Producing event:', data);
        this.broker.emit('greet', data);
    }
}

컨슈머

이벤트 브로커에 등록되어 이벤트를 처리

class EventConsumer {
    constructor(private broker: EventBroker) {
        // 이벤트 핸들러 등록
        this.broker.on('greet', this.handleGreetEvent);
    }

    // 이벤트 처리 함수
    private handleGreetEvent(data: any): void {
        console.log('Consumed event:', data.message);
    }
}

0개의 댓글