SSE(Server-Sent Events) 이해와 그 장점
February 1, 2024
소개
SSE(Server-Sent Events)는 HTTP 프로토콜을 기반으로 클라이언트와 서버 간의 단방향 통신 프로토콜입니다. 이를 통해 서버는 클라이언트로부터 명시적인 요청 없이도 실시간으로 데이터를 푸시할 수 있습니다. 표준 HTTP 프로토콜을 기반으로 하는 SSE는 단방향 지속 연결을 활용하여 서버가 클라이언트에게 이벤트와 데이터를 능동적으로 전송할 수 있게 합니다.
기본적으로 스트리밍 방식을 사용하여 구현되며, 클라이언트가 서버에 연결 요청을 시작하고 연결을 유지합니다. 그러면 서버가 클라이언트에게 메시지를 능동적으로 푸시합니다. Server-Sent Events(SSE)를 사용하여 서버에서 클라이언트로 전송되는 데이터는 UTF-8로 인코딩되어야 하며, 반환되는 콘텐츠 유형은 text/event-stream
입니다. 예를 들어, ChatGPT를 사용할 때 질문을 하면 답변을 단어별로 표시하는 것을 볼 수 있습니다. 실제로 ChatGPT는 미리 계산된 데이터를 사용자에게 '푸시'하며, SSE 기술을 사용하여 계산 중에 데이터를 반환함으로써 긴 인터페이스 대기 시간으로 인해 페이지가 직접 닫히는 것을 방지합니다.
SSE의 장점
-
실시간 통신: SSE는 실시간 통신 메커니즘을 제공하여 서버가 클라이언트에게 능동적으로 데이터를 푸시할 수 있습니다. 이러한 실시간 기능은 실시간 채팅, 온라인 협업 도구, 실시간 데이터 표시 및 알림 전달과 같이 즉각적인 업데이트가 필요한 애플리케이션에 특히 적합합니다.
-
네트워크 부하 감소: 전통적인 폴링 방식과 비교하여 SSE는 장기 연결을 활용합니다. 단일 HTTP 연결을 통해 서버는 클라이언트에게 여러 이벤트를 푸시할 수 있으며, 빈번한 HTTP 요청을 피함으로써 네트워크 부하를 줄입니다.
-
경량: SSE는 HTTP 프로토콜을 기반으로 하며, 기존 서버 소프트웨어에서 지원되며 WebSocket에 비해 사용이 간단합니다.
-
자동 재연결: SSE는 연결이 끊어진 후 자동으로 재연결을 시도할 수 있으며, 추가 코드가 필요하지 않습니다. 이 자동 재연결 메커니즘은 시스템 안정성을 향상시켜 불안정한 네트워크 조건에서도 지속적인 통신을 보장합니다.
API7 Enterprise를 사용한 SSE 서비스 프록시
실제 애플리케이션에서 API 게이트웨이를 활용하여 SSE 서비스를 프록시하는 것은 서비스 안정성을 높이고, 보안 및 교차 출처 문제를 해결하며, 복잡한 애플리케이션 시나리오를 처리하는 데 적합합니다. NGINX는 가장 인기 있는 역방향 프록시 서버 중 하나로 상당한 시장 점유율을 가지고 있습니다.
NGINX에서 SSE 서비스를 프록시할 때는 proxy_buffering
을 비활성화해야 합니다. 그러나 이 구성은 최소한 위치 수준에서 닫아야 하며, 시스템에 여러 위치가 있고 그 중 일부만 SSE 서비스를 지원하기 위해 캐싱을 비활성화해야 하는 경우 다른 비-SSE API의 성능에 영향을 미칠 수 있습니다. 또한 NGINX의 proxy_buffering
구성은 런타임에 동적으로 활성화 또는 비활성화할 수 없어 유연성이 부족하며, 구성 재로드가 필요하여 서비스 중단을 초래할 수 있습니다.
API7 Enterprise는 proxy-buffering 플러그인을 제공하여 SSE 업스트림 서비스를 더 유연하게 프록시할 수 있게 합니다. 이 플러그인을 해당 경로에서 활성화하면 전체 구성을 다시 로드할 필요 없이 캐싱을 쉽게 제어할 수 있습니다. 이러한 유연성은 SSE 서비스 프록시 요구 사항을 충족시키는 동시에 성능 및 동적 구성 요구 사항도 해결합니다.
아래와 같이 테스트하여 SSE 서비스가 성공적으로 프록시되었음을 확인할 수 있습니다.
curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"
event: server
data: 27d365b177ae
id: 1
event: request
data: GET /.sse HTTP/1.1
data:
data: Host: 127.0.0.1:9080
data: Accept: text/event-stream
data: User-Agent: curl/8.1.2
data: X-Forwarded-For: 192.168.65.1
data: X-Forwarded-Host: 127.0.0.1
data: X-Forwarded-Port: 9080
data: X-Forwarded-Proto: http
data: X-Real-Ip: 192.168.65.1
data:
id: 2
event: time
data: 2024-01-29T04:04:20Z
id: 3
event: time
data: 2024-01-29T04:04:21Z
id: 4
...
결론
요약하자면, SSE는 실시간 통신 및 업데이트가 필요한 시나리오에 적합하며, 이를 달성하기 위한 간단하고 효과적인 수단을 제공합니다. 그러나 SSE는 단방향 채널이므로 서버만 클라이언트에게 메시지를 보낼 수 있다는 점에 유의해야 합니다. 따라서 SSE는 모든 유형의 실시간 통신 요구 사항에 적합하지 않을 수 있습니다. 더 복잡한 양방향 통신 시나리오의 경우 WebSocket 또는 다른 기술이 더 적합할 수 있습니다.