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 기반 방식으로 서버에서 알림을 전송한다.
전체 흐름
- 클라이언트가 메시지를 서버에 전송
- 서버는 메시지를 브로커에 발행
- WebSocket 서버가 사용자 접속 상태를 확인
- 접속 중이면 WebSocket으로 메시지 전달
- 오프라인 상태면 Push(Firebase/APNS)를 통해 알림 전송
7. 전체 구조 요약
- WebSocket은 지속 커넥션 기반의 양방향 통신을 제공한다.
- 메시지 브로커는 메시지 저장, 순서 보장, 확장성을 담당한다.
- Pub/Sub 패턴으로 발행자와 구독자 간 결합을 낮춘다.
- Partition Key를 통해 순서를 유지한다.
- Idempotency 처리를 통해 중복 메시지를 제거한다.
- 오프라인 사용자를 위해 Push 시스템과 연동한다.