HTTP
HTTP 1.0
- Open TCP connection
- Send GET Request
- Receive Response
- Close TCP connection
TCP 3-way handshake expensive
HTTP 1.1
- Open TCP connection
- Send GET Request
- Receive Response
- Close TCP connection if I want to
WebSockets
- Open connection
- GET 1.1 UPGRADE
- 101 - Switching Protocols
- No longer HTTP
- Bidirectional no order
Server Sent Events
- Open connection
- Send GET text/event-stream
- Respond : Content-Type = text/event-stream / Transfer-Encoding chunked
- keep sending more chunks
- Server or Client can close connection
SSE Example
SSE use cases
- Live Feed
- Showing client progress
- Logging
Coding
SSE Pros and Cons
Pros
- Lightweight
- packets are small because there are no headers unlike the websocket
- HTTP & HTTP/2 compatible
- Firewall friendly (standard)
Cons
- Proxying is tricky
- L7 L/B challenging (timeouts)
- client cannot keep connection alive
- Stateful, difficult to horizontally scale
Do I have to use SSE?
- WebSockets
- sse is limited only purely server sent events
- overhead to HTTP there are its own protocol headers
- Long polling
์ค์๊ฐ ๊ธฐ์
Polling
- ํน์ ์ฃผ๊ธฐ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ์ ๋ณํ๊ฐ ์์ด๋ ๊ณ์ํด์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ํต์ ์ด ๋ง์ด ์ด๋ฃจ์ด์ง๋ค.
- ๊ธฐ์กด ์ฐ๋ฆฌ ์๋ฒ๋ 0.5์ด ๊ฐ๊ฒฉ์ผ๋ก ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๊ณ ์์๋ค.
Long Polling
- ์๋ฒ์์ ์ ์์ ์ด์ด๋๊ณ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ต์ ๋ณด๋ธ๋ค.
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ์๋ต์ด ์ด๋ฃจ์ด์ ธ ์ค์๊ฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๋ฐ์ ์ ๋์์ Response ๋ฅผ ๋ณด๋ด๊ณ Request ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ์ผ๋ก ํ์ ๋ง์ ์์ ๋ช ๋ น์ด ์์ฌ ์๋ฒ์ ๋ฌด๋ฆฌ๊ฐ ๊ฐ๋ค.
Web Socket
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ TCP connection ์ ์ ์งํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์๋ฐฉํฅ ํต์ ์ด๋ค.
Server Sent Event
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ TCP connection ์ ์ ์งํ์ฌ ์๋ฒ โ ํด๋ผ์ด์ธํธ ๋ฐฉํฅ์ผ๋ก๋ง ํต์ ํ๋ ๋จ๋ฐฉํฅ ํต์ ์ด๋ค.
- Web Socket ์ ๊ธ์ง ๊ธฐ์ ์ด์๊ณ SSE ๋ก๋ ์ถฉ๋ถํ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ์ฌ SSE ๋ฅผ ์ฌ์ฉํ๋ค.
Spring SseEmitter
Polling
NginX ์ค์
server {
...
location / {
...
# SSE through NginX
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
...
}
...
}
ํ์ฌ ํ๋ก์ ํธ ๊ตฌ์กฐ์์ NginX ๋ฅผ ํตํด ๋ฐฑ์๋ ์๋ฒ์ ํต์ ํ๊ณ ์๋ค.
SSE ๋ฅผ NginX ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ฃผ๊ธฐ ์ํด์ location
๋ด๋ถ์ ์์ ๊ฐ์ ์ค์ ์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
References
- Server-Sent Events Crash Course
- [Spring + SSE] Server-Sent Events๋ฅผ ์ด์ฉํ ์ค์๊ฐ ์๋ฆผ
- Spring Event์ SSE ๋ก ๋ฆฌ์กํฐ๋ธํ๊ฒ ์ ๊ทผํ๊ธฐ (EventListener, Server-Sent Events, ๋น๋๊ธฐ ์ปจํธ๋กค๋ฌ, RxJava๋ก ๋์ผํ๊ฒ ์ฌ๊ตฌํ)
- Spring Boot, SSE(Server-Sent Events)๋ก ๋จ๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ ํต์ ๊ตฌํํ๊ธฐ
- SSE Spec
- SseEmitter Reconnect
- Server-Sent Events with Spring
- Spring Boot Async Controller with SseEmitter
- SseEmitterTests
- Distributed SSE with Spring SseEmitter and Redis Pub/Sub
- Server-Sent Events (SSE) in Spring 5 with Web MVC and Web Flux