2025-12-01

오늘 배운 것

실시간 메시징 시스템 기본 구조

1. WebSocket

1) Handshake 과정

  • 초기 연결은 HTTP 요청으로 시작된다.
  • 클라이언트가 Upgrade: websocket 헤더를 포함한 요청을 보낸다.
  • 서버가 101 Switching Protocols 응답을 보내면 프로토콜이 WebSocket으로 전환된다.
  • 연결이 형성되면 하나의 TCP 커넥션으로 양방향 통신이 지속된다.

2) Frame 구조

  • WebSocket은 데이터를 Frame 단위로 나눠 전송한다.
  • 주요 필드는 FIN, Opcode, Masking, Payload Length 등이 있다.
  • 메시지가 큰 경우 여러 프레임으로 분할해 전송하고, FIN 비트를 통해 마지막 여부를 표시한다.

3) Ping/Pong 유지

  • 연결 상태 확인을 위해 주기적으로 ping/pong 메시지를 주고받는다.
  • 응답이 없으면 연결을 끊고 재연결 과정을 진행한다.

2. 메시지 브로커

목적

  • 실시간 서버가 모든 메시지를 직접 처리하면 확장성과 내구성이 떨어지기 때문에, 메시지 전달·순서·저장을 브로커가 맡는다.

Kafka 핵심 개념

  • Topic: 메시지가 저장되는 논리적 단위
  • Partition: Topic을 여러 조각으로 나눈 것. 병렬 처리와 확장성을 위한 구조
  • Offset: Partition 내 메시지의 고유 index
  • Consumer Group: 여러 소비자가 병렬로 메시지를 처리할 수 있도록 구성

Kafka 특징

  • 파티션 단위로 순서가 보장된다.
  • 고처리량 스트리밍에 적합하다.
  • 디스크 기반 로그 저장으로 내구성이 높다.

RabbitMQ와 간단 비교

  • RabbitMQ는 전통적인 메시지 큐에 가깝고, 라우팅이나 패턴 분배에 강점이 있다.
  • Kafka는 대규모 데이터 스트리밍과 로그 처리에 적합하다.

3. Pub/Sub 패턴

  • Publisher가 메시지를 발행하면 Broker가 Subscriber에게 전달하는 구조.
  • 발행자와 구독자가 서로 독립적이다.
  • 확장성과 재사용성이 높다.
  • 동일 메시지를 여러 소비자에게 동시에 배포할 수 있다.

4. 메시지 순서 보장

Partition 기반 순서 보장

  • Kafka의 경우 Partition 내부에서는 Offset 증가 순서대로 메시지가 저장된다.
  • 특정 기준(예: 채팅방 ID)를 Partition Key로 고정하면 해당 파티션에서 순서가 유지된다.

Producer 레벨 설정

  • 메시지 유실을 막기 위해 ack 설정, idempotent producer 설정 등으로 안정성을 높일 수 있다.

5. 메시지 중복 처리(Idempotency)

네트워크 재시도 등으로 인해 메시지가 중복 도착할 수 있으므로 중복 제거 로직이 필요하다.

대표적인 방식:

  • 메시지 ID 기반 체크 (최근 처리한 메시지 ID를 서버·캐시 등에 저장)
  • Redis Set, Bloom Filter 등을 이용한 중복 검출
  • Kafka는 Offset을 기반으로 같은 메시지를 여러 번 읽지 않도록 제어할 수 있다.

6. 모바일 Push 연동

필요성

  • 모바일 앱은 백그라운드에서 WebSocket 연결이 종료되는 경우가 많다.
  • 오프라인 상태에서도 메시지 알림을 전달해야 한다.

FCM

  • Firebase Cloud Messaging 사용.
  • 토큰 기반으로 특정 사용자에게 알림을 보낼 수 있다.

APNS

  • iOS 환경에서 사용하는 Push 서비스.
  • 인증서 또는 Token 기반 방식으로 서버에서 알림을 전송한다.

전체 흐름

  1. 클라이언트가 메시지를 서버에 전송
  2. 서버는 메시지를 브로커에 발행
  3. WebSocket 서버가 사용자 접속 상태를 확인
  4. 접속 중이면 WebSocket으로 메시지 전달
  5. 오프라인 상태면 Push(Firebase/APNS)를 통해 알림 전송

7. 전체 구조 요약

  • WebSocket은 지속 커넥션 기반의 양방향 통신을 제공한다.
  • 메시지 브로커는 메시지 저장, 순서 보장, 확장성을 담당한다.
  • Pub/Sub 패턴으로 발행자와 구독자 간 결합을 낮춘다.
  • Partition Key를 통해 순서를 유지한다.
  • Idempotency 처리를 통해 중복 메시지를 제거한다.
  • 오프라인 사용자를 위해 Push 시스템과 연동한다.

results matching ""

    No results matching ""