blog

푸시(Push) / 풀(Pull) 아키텍처 개념 및 사례

날짜: 2025-02-23

목록으로


푸시(Push) 아키텍처

정의

✅ HTTP 기반에서 푸시가 어려운 이유

기본적으로 HTTP는

즉, 일반적인 HTTP 요청 방식에서는
🚫 서버가 먼저 클라이언트에게 데이터를 보낼 방법이 없다
(클라이언트가 요청하지 않으면 서버는 아무것도 못 함)


웹소켓(WebSocket) - 양방향 실시간 통신

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()

SSE(Server-Sent Events) - 단방향 푸시

Client 코드 예시

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();  // 필요하면 연결 닫기
};

Server 코드 예시

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)

Long Polling - 가짜 푸시 방식

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 기반 시스템과 쉽게 통합하려면 SSELong 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, Long Polling을 선택해야 할까?

| 사용 목적 | 추천 기술 | |———–|———-| | 실시간 채팅, 게임, 금융 데이터 | WebSocket | | 서버에서 클라이언트로만 실시간 데이터 전송 | SSE | | 기존 HTTP 시스템에서 푸시 비슷한 기능 필요 | Long Polling |


풀(Pull) 아키텍처

정의

활용 사례

파이썬 구현 (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 엔드포인트에서 데이터를 가져와 모니터링함)


푸시 vs 풀 비교 요약

  푸시 (Push) 풀 (Pull)
데이터 흐름 생산자가 직접 전달 소비자가 요청
실시간성 높음 상대적으로 낮음
부하 조절 소비자가 제어 불가 소비자가 제어 가능
활용 사례 실시간 알림, IoT 센서 모니터링, REST API

결론


목록으로