관리 메뉴

백엔드 개발자 블로그

SSE 이벤트 푸쉬로 불필요한 Polling 제거하기 본문

테크 블로그 리뷰

SSE 이벤트 푸쉬로 불필요한 Polling 제거하기

backend-dev 2025. 7. 6. 11:12

SSE 알람 서비스를 구현한 경험을 했지만, 현업에서는 어떻게 사용하고 있는지 궁금하여

토스ㅣSLASH 24 - SSE 이벤트 푸쉬로 불필요한 Polling 제거하기를 리뷰한 글입니다.

https://www.youtube.com/watch?v=ovGgdPPUZ2I

 


WebSocket vs SSE


사용 사례

WebSocket

  • 송/수신량 데이터량이 많을 때 사용
  • 시세 위주 사용

SSE

  • 불필요한 pollilng 제거할때 사용
  • 개인화된 데이터를 이용한 이벤트 푸쉬할 때 사용


Client Side Message 전략

1. broadcasting

한번에 여러곳에 이벤트 푸쉬

 

구현 방법 

webflux로 구현

  1. 브로드캐스팅 채널 만듦
  2. 채널 부팅 되자마자 메세지 프로커로부터 수신
  3. 수신 받는 메세지를 SSE 메세지로 컨버팅
  4. 브로드 캐스팅 채널에 connect한 client에게 메세지 전달


2. unicasting

개인화된 데이터를 이용한 이벤트 푸쉬

 

구현 방법

  1. 개인 채널 만듦
  2. 개인 데이터 수신
  3. SSE 메세지로 변환
  4. 개인 채널에 연결된 클라이언트에게 메세지 전달

 

개인용 data stream 만드는 방법

 

1. flux stream 만들기

2. 본인메세지 필터링하는 리스너 발급

3. 메세지 수신하겠다고 메세지 브로커에게 요청

4. Client와 SSE 연결이 끊어지면 메세지 브로커에 구독 취소 요청


실제 사용 사례

1. 보유자산 polling 제거

1. 보유 종목 조회 (3초마다 polling이 이뤄짐) 

2. 주문 api 

3. 재조회 event

재조회 이벤트가 발생한 경우에만 조회 db 변경

 

그렇다고 3초 주기 polling을 없앨 수 없으므로 SSE server 

이거 둬서 30% 정도 개선됨

 

2. 안드로이드 푸쉬알람 대체

접속된 사용자는 SSE, 접속 안된 사용자는 FCM

사용자 상태는 redis pub/sub에 저장하여 session으로 사용


Message broker 선택 전략

  • kafka : 접속, 비접속 필터링이 어려워서 패스
  • redis pub/sub : 접속, 비접속 필터링이 가능해서 선택
  • nats : broker로 활용, pub/sub기반, cluster 기능으로 부하분산 가능, redis에 비해 5배 좋음(30k)

정리

1. polling 대체제 : SSE

2. message broker 선택 전략 : nats

3. SSE connection이 정상 close 됬는지 모니터링 도구 : heart beat