날짜: 2025-02-23
정의
기본적으로 HTTP는
즉, 일반적인 HTTP 요청 방식에서는
🚫 서버가 먼저 클라이언트에게 데이터를 보낼 방법이 없다
(클라이언트가 요청하지 않으면 서버는 아무것도 못 함)
import asyncio
import websockets
async def handler(websocket, path):
while True:
await websocket.send("Hello Client!")
await asyncio.sleep(1) # 1초마다 메시지 전송
start_server = websockets.serve(handler, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
const eventSource = new EventSource("http://localhost:5000/events");
eventSource.onmessage = function(event) {
console.log("Received event:", event.data);
};
// 연결이 닫혔을 때
eventSource.onerror = function(event) {
console.error("EventSource failed:", event);
eventSource.close(); // 필요하면 연결 닫기
};
from flask import Flask, Response
import time
app = Flask(__name__)
@app.route('/events')
def events():
def generate():
while True:
yield f"data: {time.ctime()}\n\n"
time.sleep(2)
return Response(generate(), mimetype='text/event-stream')
app.run(port=5000)
from flask import Flask, jsonify
import time
app = Flask(__name__)
@app.route('/poll')
def poll():
time.sleep(5) # 새로운 데이터가 생길 때까지 기다린다고 가정
return jsonify({"message": "New event received!"})
app.run(port=5001)
(클라이언트는 일정 간격으로 GET /poll
요청을 보내면서 대기)
✅ 최적의 선택
사용하는 서비스의 특성에 따라 다르지만, 실시간성이 필요한 경우라면 WebSocket이 가장 많이 사용돼.
다만, 기존의 HTTP 기반 시스템과 쉽게 통합하려면 SSE나 Long Polling도 여전히 활용되고 있어.
| 기술 | 주요 활용 사례 | 특징 | |——|————-|——| | WebSocket | 채팅, 게임, 실시간 주식 데이터, WebRTC | ✅ 양방향 통신 가능, 실시간성이 가장 뛰어남 | | SSE (Server-Sent Events) | 실시간 대시보드, 뉴스 업데이트 | ✅ HTTP 기반으로 설정이 간편, 단방향 통신 | | Long Polling | 푸시 알림 대체, 간단한 채팅 시스템 | ✅ 기존 HTTP 기반 시스템과 쉽게 연동 가능 | | gRPC Streaming | MSA 환경의 서비스 간 실시간 데이터 전송 | ✅ HTTP/2 기반, 성능 최적화된 스트리밍 지원 |
1️⃣ 웹 기반 실시간 서비스 → WebSocket
2️⃣ 모니터링 & 데이터 스트리밍 → SSE(Server-Sent Events)
3️⃣ 일반적인 HTTP 서비스에서 푸시 필요 → Long Polling
| 사용 목적 | 추천 기술 | |———–|———-| | 실시간 채팅, 게임, 금융 데이터 | WebSocket | | 서버에서 클라이언트로만 실시간 데이터 전송 | SSE | | 기존 HTTP 시스템에서 푸시 비슷한 기능 필요 | Long Polling |
정의
활용 사례
파이썬 구현 (Prometheus 스타일 데이터 수집)
import time
import requests
def fetch_metrics():
response = requests.get("http://localhost:8000/metrics")
return response.json()
while True:
metrics = fetch_metrics()
print(metrics)
time.sleep(5) # 5초마다 데이터 가져오기
👆 설명: 특정 URL에서 메트릭을 일정 주기로 가져오는 간단한 풀 방식 코드.
(실제 Prometheus는 /metrics
엔드포인트에서 데이터를 가져와 모니터링함)
푸시 (Push) | 풀 (Pull) | |
---|---|---|
데이터 흐름 | 생산자가 직접 전달 | 소비자가 요청 |
실시간성 | 높음 | 상대적으로 낮음 |
부하 조절 | 소비자가 제어 불가 | 소비자가 제어 가능 |
활용 사례 | 실시간 알림, IoT 센서 | 모니터링, REST API |
✅ 결론
푸시(Push)
풀(Pull)