LLM 서비스의 통신은 겉보기엔 “요청 보내고 응답 받는 API”지만, 실제로는 다음 요구가 겹칩니다.
-
체감 속도(TTFT): 첫 토큰을 빨리 보여주고 싶다
-
긴 응답 시간: 수 초~수십 초 동안 응답이 이어진다
-
취소/중단: 생성 중 cancel이 자주 필요하다(비용과 UX)
-
이벤트: tool-call, progress, usage, error 같은 상태 이벤트를 흘려야 한다
-
대규모 동시성: 연결 유지 비용, LB idle timeout, 재연결 폭주 등 운영 이슈
여기서 흔히 후보로 올라오는 게:
-
일반 HTTPS(요청-응답)
-
SSE(Server-Sent Events, 서버→클라 스트리밍)
-
WebSocket(양방향 지속 연결)
중요한 포인트 하나: SSE와 WebSocket도 결국 TLS 위에서 동작합니다. 즉 “HTTPS vs SSE vs WebSocket” 비교는 엄밀히 말해
(A) 일반 HTTPS 요청-응답 vs (B) HTTPS 위 SSE 스트림 vs (C) TLS 위 WebSocket(wss) 비교로 보면 됩니다.
1) 세 가지의 성격을 한 문장으로 정리
| 방식 | 한 줄 정의 | LLM에 잘 맞는 상황 |
|---|---|---|
| 일반 HTTPS(요청-응답) | “보내고, 끝나면 한 번에 받기” | 짧은 응답 / 최대 처리량 / 운영 단순 |
| SSE | “요청 1번 → 서버가 이벤트/토큰을 계속 흘려줌(단방향)” | 토큰 스트리밍 UX / 상태 이벤트 |
| WebSocket | “하나의 연결로 양방향 메시지 계속 주고받기” | 세션형 에이전트/실시간 상호작용 |
2) LLM 통신에서 중요한 평가 기준
LLM 통신은 “RPS(초당 요청 수)”보다 아래가 더 중요해지는 순간이 많습니다.
-
동시 요청(활성 생성) 수 = 평균 생성 시간 × 유입률
-
연결 유지 비용 = 동시 연결 수 × (FD/메모리/버퍼/keepalive)
-
재연결 폭주: 장애나 네트워크 흔들림에서 reconnect storm
-
취소 전파: 사용자가 취소하면 추론을 실제로 멈춰 비용 절감 가능?
3) 기능/운영/성능 관점 비교표
3-1. 기능 관점(LLM UX/프로토콜 설계)
| 항목 | 일반 HTTPS | SSE | WebSocket |
|---|---|---|---|
| 토큰 스트리밍 | 가능(청크)하나 환경별 난이도↑ | 매우 적합(표준 event-stream) | 적합 |
| 이벤트 타입 분리(token/tool/progress) | 앱이 직접 포맷 정의 | event/data 프레임으로 깔끔 | 메시지 타입 정의로 깔끔 |
| 클라→서버 실시간 입력 | 요청마다 전송 | 별도 HTTP 필요 | 같은 연결로 가능 |
| 취소(cancel) | 별도 cancel API/연결끊김 감지 | 연결 끊기면 감지 쉬움 + cancel API도 쉬움 | 메시지로 cancel 즉시 가능 |
| 재연결/이어받기 | 앱 레벨 구현 | 자동 재연결 + Last-Event-ID 패턴 | 앱 레벨 구현 |
핵심 요약
-
SSE의 고유 장점은 “서버→클라 스트리밍의 표준화 + 재연결 패턴”에 있습니다.
-
“클라→서버 입력이 많다”가 핵심이면 SSE는 별도 HTTP를 붙여야 하므로 WebSocket이 더 자연스러워질 가능성이 큽니다.
3-2. 운영 관점(대규모에서 터지는 지점)
| 항목 | 일반 HTTPS | SSE | WebSocket |
|---|---|---|---|
| LB/프록시 친화성 | 최상 | 대체로 양호(버퍼링/idle 주의) | 환경에 따라 까다로움(업그레이드/idle) |
| 연결 유지 비용 | 낮음(요청 짧으면) | 높음(롱리빙 연결) | 높음(롱리빙 연결) |
| 장애 시 영향 | 제한적 | 재연결 폭주 관리 필요 | 재연결 폭주 + 세션 상태 관리 필요 |
| 구현 난이도 | 낮음 | 중간 | 중~상 |
4) “SSE는 별도 HTTP가 필요하면 HTTP랑 뭐가 다르냐?”에 대한 답
맞습니다. 클라→서버를 지속적으로 고빈도로 보내야 하는 앱이라면 SSE는 “2채널(업로드=HTTP, 다운로드=SSE)”이 되어 HTTP와 차이가 줄고, 동기화(세션ID/순서/중복) 부담이 생깁니다.
그럼에도 LLM에서 SSE가 선택되는 이유는 보통 이겁니다.
-
LLM은 대부분 다운스트림(서버→클라) 토큰 스트리밍이 핵심이다
-
업스트림(클라→서버)은 대개 저빈도(send/cancel/regenerate 정도)다
-
SSE는 이벤트 스트림 표준이라 클라이언트/중간장비에서 “스트리밍 응답”을 다루기가 상대적으로 낫다
-
끊김에 대해 자동 재연결 + 이어받기 패턴이 설계하기 쉽다
즉 **LLM의 트래픽 비대칭(업로드 1회, 다운로드 길게)**에 SSE가 잘 맞습니다.
5) 규모별 추천: 1천~1천만 동시 사용자
아래 표에서 “동시 사용자”는 **동시에 LLM 결과를 기다리는 사용자(활성 세션)**로 해석하면 실무 감각과 맞습니다.
(동시 “접속”과 동시 “추론”은 다를 수 있지만, 통신 설계는 보통 활성 세션 기준으로 고민합니다.)
5-1. 추천 전략(요약표)
| 동시사용자 | 추천 1순위 | SSE/WS 사용 방식 | 이유(통신 관점) |
|---|---|---|---|
| 1,000 | 일반 HTTPS + (옵션) SSE | 스트리밍 필요하면 SSE 전면 도입 가능 | 운영 단순, UX 개선도 부담 적음 |
| 10,000 | HTTPS + SSE | 스트리밍 UX가 중요하면 SSE “기본” 가능 | 이 구간까진 튜닝으로 충분히 감당 |
| 100,000 | 비동기 잡(HTTPS 접수) + 상태조회(HTTPS) + SSE는 선별 | “지금 화면 보고 있는” 활성 세션만 SSE | 10만 롱리빙 연결은 가능해도 운영 난이도 급상승(재연결 폭주/idle/FD/버퍼) |
| 1,000,000 | 비동기 잡 중심 + 결과 pull(HTTPS) + 푸시 최소 | SSE/WS는 극소수(프리미엄/콘솔) | 통신만으로도 큰 시스템이 됨. 스트리밍은 선택지에서 빠짐 |
| 10,000,000 | 비동기 잡 + 캐시/재사용 + 강한 제한 | SSE/WS는 사실상 금지(특수 케이스만) | 1천만 동시 스트리밍은 “스트리밍 플랫폼”을 운영하는 수준 |
6) 실무에서 가장 잘 먹히는 “혼합 패턴”
규모가 커질수록 “한 가지 프로토콜로 통일”보다 역할 분리가 강해집니다.
6-1. 10만+에서 현실적인 표준 패턴
| 목적 | 통신 | 엔드포인트 예 |
|---|---|---|
| 요청 접수(큐잉/레이트리밋) | HTTPS POST | POST /llm/jobs → job_id |
| 상태/결과 조회(저비용 pull) | HTTPS GET | GET /llm/jobs/{id} |
| 스트리밍(UX 필요한 소수 세션) | SSE | GET /llm/stream/{id} |
| 취소/컨트롤 | HTTPS POST | POST /llm/jobs/{id}/cancel |
왜 이게 강하냐?
-
대다수 트래픽은 짧은 HTTPS로 흡수 → 고RPS/운영 단순
-
스트리밍은 **“지금 보고 있는 사용자”**에게만 제공 → 동시 연결 폭발 억제
-
cancel은 HTTP로도 충분히 빠름(고빈도가 아닌 경우가 대부분)
6-2. WebSocket은 어디에 쓰는 게 맞나?
WebSocket은 “LLM 채팅”에 무조건 좋은 게 아니라, 아래 케이스에서 진가가 납니다.
-
에이전트/음성/실시간 조종 등 양방향 고빈도가 핵심
-
하나의 세션에서 여러 종류의 메시지(입력/토큰/툴콜/상태/취소)를 단일 연결로 정교하게 다루고 싶을 때
-
운영 복잡도를 감수하고도 “세션형 제품” 가치가 큰 경우
7) 체크리스트: 대규모에서 통신이 무너지는 흔한 이유
7-1. SSE/WS 공통
-
Idle timeout: LB/프록시에서 유휴로 판단해 끊김 → keepalive/ping 필요
-
버퍼링: 중간 장비가 스트림을 모아서 한 번에 보내 UX가 망가짐 → 버퍼링 설정 점검
-
재연결 폭주: 장애 후 동시에 재연결 → 지수 백오프, jitter, 토큰 버킷형 제한
7-2. LLM 특화
-
취소가 추론 중단으로 이어지지 않음 → 비용 폭발 (cancel을 “진짜 stop”으로 연결)
-
큐잉 전략 없음 → 10만에서 바로 붕괴 (접수/대기/완료를 분리해야 함)
최종 결론
-
1천~1만: “HTTPS + SSE 스트리밍”이 가장 균형 좋다
-
10만: “HTTPS(접수/조회) + SSE(선별 스트리밍)”로 역할을 분리하는 게 최적
-
100만~1000만: “비동기 잡 중심(HTTPS) + 캐시/제한 + 스트리밍 최소화”가 현실적인 유일해에 가깝다
-
WebSocket은 “LLM 세션형 상호작용”이 본질일 때만 적극 추천 (그 외엔 운영비가 더 큼)
댓글
댓글 쓰기