[톡바로] Kafka? WebSocket? 니 누고!!

kingkang·2025년 6월 4일

오늘은 채팅 서비스에 쓸 기술 공부를 좀 했다!
개발하면서 더 수정해야징


Apache Kafka

Kafka란?

실시간으로 스트리밍 데이터를 수집하고 처리하는 데 최적화된 분산 데이터 스토어

핵심 구성요소

Producer → Topic(Partition) → Consumer
    ↓             ↓               ↓
메시지 생성      저장/분산      메시지 처리
  • Broker: Kafka 서버들로 구성된 클러스터
  • Topic: 메시지를 분류하는 카테고리 (채널 개념)
  • Partition: 토픽을 나눈 단위로 병렬 처리와 순서 보장
  • Producer: 메시지를 발행하는 클라이언트
  • Consumer: 메시지를 구독하고 처리하는 애플리케이션

주요 장점

  1. 확장성: 파티션을 통한 수평 확장 가능
  2. 지속성: 디스크 저장과 복제로 데이터 안전성 보장
  3. 고성능: 초당 수백만 개의 메시지 처리
  4. 내결함성: 서버 장애 시에도 데이터 손실 방지

채팅 서비스에서의 역할

  • 채팅 메시지를 안정적으로 전달하고 저장
  • 여러 서버 인스턴스 간 메시지 동기화
  • 메시지 히스토리 관리
  • 대규모 사용자 환경에서 메시지 처리량 확보

WebSocket

WebSocket이란?

양방향 소통이 가능한 서버와 클라이언트 사이에 데이터를 주고받을 수 있는 프로토콜

WebSocket 작동 원리

연결 과정

  • 핸드셰이크: 클라이언트가 'Upgrade' 헤더가 포함된 HTTP 요청을 서버에 전송
  • 프로토콜 업그레이드: 서버가 WebSocket 프로토콜로 연결 업그레이드 확인 응답
  • 지속 연결: 전이중 연결이 설정되어 클라이언트와 서버 모두 자유롭게 메시지 교환

메시지 전송

  • 메시지는 헤더와 페이로드로 구성된 프레임 단위로 전송
  • 텍스트나 바이너리 형태로 직렬화 가능한 모든 데이터 전송 가능

주요 장점

  • 실시간성: 지속적이고 낮은 지연 시간의 양방향 통신
  • 효율성: 단일 연결로 서버 리소스 최적화
  • 서버 푸시: 클라이언트 요청 없이 서버에서 콘텐츠 전송 가능

STOMP.js

STOMP란?

pub-sub 이라는 발행-구독 형태를 사용해 쉽게 메세지를 주고받을 수 있는 프로토콜

STOMP 사용 이유

순수 WebSocket의 한계

WebSocket 프로토콜은 텍스트와 바이너리 두 가지 메시지 타입만 정의하지만, 메시지 내용은 정의하지 않음
즉, 개발자가 직접 메시지 형식과 라우팅을 구현해야 함

STOMP의 해결책

CONNECT, SUBSCRIBE, UNSUBSCRIBE, ACK, SEND 등의 프레임 타입을 제공하여 통신 관리를 단순화하고, 메시지 확인응답 같은 고급 기능을 구현할 수 있음

세 기술의 연동 구조 정리

  1. 클라이언트 → STOMP.js로 WebSocket 연결
  2. WebSocket → 실시간 양방향 통신 제공
  3. 서버 → 받은 메시지를 Kafka로 전송
  4. Kafka → 메시지를 다른 서버 인스턴스들에게 배포
  5. 서버들 → Kafka에서 메시지를 받아 WebSocket으로 클라이언트들에게 전달
profile
꿈을 꾸물꾸물 꾸지 말자!

0개의 댓글