Spring webflux를 활용한 SSE(Server Sent Event) 구현

2023. 7. 15. 13:30Spring/webflux

728x90

SSE(Server Sent Event) 란?

서버의 데이터를 실시간으로 스트리밍 하는 기술

HTTP프로토콜 기반

text/event-stream 미디어 타입 사용 

클라이언트와 서버가 최초 한 번 HTTP 연결 후 서버가 클라에게 지속적으로 데이터 전송

단방향 통신, 실시간 업데이트, 자동 재연결 기능 제공

 

spring에서 SSE 구현 방법

SseEmmiter

Spring MVC에서 SSE를 구현하는 스택.

간단하게 사용 가능하고 스레드 기반으로 동작하나, 높은 리소스 사용하고 확장성에 제한이 있음

 

https://github.com/phjppo0918/SseEmitter-sample

 

GitHub - phjppo0918/SseEmitter-sample

Contribute to phjppo0918/SseEmitter-sample development by creating an account on GitHub.

github.com

Webflux

리엑티브 프로그래밍 모델 지원, 효율적인 리소스 사용, 높은 확장성을 가지나, 러닝커브가 있음

https://github.com/phjppo0918/webfluxSseTest

 

GitHub - phjppo0918/webfluxSseTest

Contribute to phjppo0918/webfluxSseTest development by creating an account on GitHub.

github.com

Webflux 예제

 

@RestController
@RequestMapping("listen")
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@RequiredArgsConstructor
public class ListenController {
    SseService sseService;

    @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<MessageDto> listen() {
        return sseService.connect();
    }
}
@RestController
@RequestMapping("speak")
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@RequiredArgsConstructor
@EnableScheduling
public class SpeakController {

    SseService sseService;

    @PostMapping
    public void sendMessage(@RequestBody MessageDto message) {
        sseService.send(message);
    }

    @Scheduled(fixedDelay = 5000)
    public void sendScheduled() {
        sseService.send(new MessageDto("주기적으로 전송"));
    }
}
public record MessageDto(String message) {}
@Service
public class SseService {
    Sinks.Many<MessageDto> sink = Sinks.many().multicast().onBackpressureBuffer();
    public Flux<MessageDto> connect() {
        return sink.asFlux().subscribeOn(Schedulers.boundedElastic());
    }

    public void send(MessageDto msg) {
        sink.tryEmitNext(msg);
    }
}

실행 결과

728x90

'Spring > webflux' 카테고리의 다른 글

Spring Webflux 및 MVC Security환경 비교  (0) 2023.07.15
Spring Webflux - Scheduler  (0) 2023.07.15
Spring Webflux Sink  (0) 2023.07.15
리액티브 스트림즈, Mono, 그리고 Flux  (0) 2023.07.14
Reactive programming - Spring webflux  (0) 2023.07.14