IT기술/webflux (reactor)

[WebFlux 심층 분석] 리액티브 스트림즈 컴포넌트 구현 및 Kafka와의 비교

후스파 2025. 3. 21. 17:58
반응형
spring framework webflux reactor

리액티브 스트림즈는 비동기적이고 Non-Blocking 방식의 데이터 처리를 위한 표준입니다. 이 글에서는 리액티브 스트림즈의 주요 컴포넌트 구현과 Apache Kafka와의 차이점을 살펴보겠습니다.

 

리액티브 스트림즈 주요 컴포넌트

  • Publisher
public class MyPublisher implements Publisher<String> {
    private final List<Subscriber<? super String>> subscribers = new ArrayList<>();

    @Override
    public void subscribe(Subscriber<? super String> subscriber) {
        subscribers.add(subscriber);
        subscriber.onSubscribe(new MySubscription(subscriber));
    }

    public void publish(String data) {
        for (Subscriber<? super String> subscriber : subscribers) {
            subscriber.onNext(data);
        }
    }
    // ... MySubscription 클래스 구현
}

 

 
  • Subscriber
public class MySubscriber implements Subscriber<String> {
    @Override
    public void onSubscribe(Subscription subscription) {
        System.out.println("구독이 시작되었습니다.");
        subscription.request(1);
    }

    @Override
    public void onNext(String data) {
        System.out.println("받은 데이터: " + data);
    }

    @Override
    public void onError(Throwable t) {
        System.err.println("오류 발생: " + t.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("모든 데이터 전송이 완료되었습니다.");
    }
}
 
 
 
  • Subscription
public class MySubscription implements Subscription {
    private final Subscriber<? super String> subscriber;

    MySubscription(Subscriber<? super String> subscriber) {
        this.subscriber = subscriber;
    }

    @Override
    public void request(long n) {
        // 요청할 데이터 개수 처리
    }

    @Override
    public void cancel() {
        System.out.println("구독이 취소되었습니다.");
    }
}
 
 
 
  • Processor
public class MyProcessor implements Processor<String, String> {
    private Subscriber<? super String> subscriber;

    @Override
    public void subscribe(Subscriber<? super String> subscriber) {
        this.subscriber = subscriber;
    }

    @Override
    public void onNext(String data) {
        String processedData = data.toUpperCase();
        subscriber.onNext(processedData);
    }
    // ... 기타 메서드 구현
}
 
 
 

리액티브 스트림즈와 Apache Kafka 비교

  1. 데이터 흐름 vs 메시지 중개:
    • 리액티브 스트림즈: 데이터 흐름 중심, 이벤트 기반 반응성
    • Kafka: 메시지 브로커 기반, Topic을 통한 메시지 전달
  2. 구독 모델 vs Topic 기반:
    • 리액티브 스트림즈: Subscriber가 데이터 요청
    • Kafka: Topic 기반 메시지 분산 처리
  3. 데이터 지속성:
    • 리액티브 스트림즈: 메모리 기반 처리
    • Kafka: 디스크에 메시지 저장, 높은 내구성
  4. 확장성:
    • 리액티브 스트림즈: 단일 애플리케이션 내 확장
    • Kafka: 분산 시스템으로 대규모 확장 가능

 

결론

리액티브 스트림즈는 애플리케이션 내 비동기 데이터 처리에 적합하며, Kafka는 대규모 분산 메시징 시스템에 적합합니다. 프로젝트의 요구사항에 따라 적절한 기술을 선택하는 것이 중요합니다.

 

 

[WebFlux] 리액티브 스트림즈 컴포넌트 코드

Publisher 인터페이스 정의: Publisher는 구독자를 등록하고, 구독 정보를 관리하는 인터페이스입니다. s...

blog.naver.com

 

 

[WebFlux 심층 분석] 리액티브 스트림즈의 핵심 개념과 구현 전략

리액티브 스트림즈(Reactive Streams)는 비동기적이고 Non-Blocking 방식으로 데이터 스트림을 처리하기 위한 표준입니다. 이 표준은 데이터 전송의 효율성을 높이고, 시스템 간의 느슨한 결합을 유지하

hoosfa.tistory.com

 

반응형