
오늘은 채팅 서비스에 쓸 기술 공부를 좀 했다!
개발하면서 더 수정해야징
실시간으로 스트리밍 데이터를 수집하고 처리하는 데 최적화된 분산 데이터 스토어
Producer → Topic(Partition) → Consumer
↓ ↓ ↓
메시지 생성 저장/분산 메시지 처리
- Broker: Kafka 서버들로 구성된 클러스터
- Topic: 메시지를 분류하는 카테고리 (채널 개념)
- Partition: 토픽을 나눈 단위로 병렬 처리와 순서 보장
- Producer: 메시지를 발행하는 클라이언트
- Consumer: 메시지를 구독하고 처리하는 애플리케이션
- 확장성: 파티션을 통한 수평 확장 가능
- 지속성: 디스크 저장과 복제로 데이터 안전성 보장
- 고성능: 초당 수백만 개의 메시지 처리
- 내결함성: 서버 장애 시에도 데이터 손실 방지
- 채팅 메시지를 안정적으로 전달하고 저장
- 여러 서버 인스턴스 간 메시지 동기화
- 메시지 히스토리 관리
- 대규모 사용자 환경에서 메시지 처리량 확보
양방향 소통이 가능한 서버와 클라이언트 사이에 데이터를 주고받을 수 있는 프로토콜
연결 과정
- 핸드셰이크: 클라이언트가 'Upgrade' 헤더가 포함된 HTTP 요청을 서버에 전송
- 프로토콜 업그레이드: 서버가 WebSocket 프로토콜로 연결 업그레이드 확인 응답
- 지속 연결: 전이중 연결이 설정되어 클라이언트와 서버 모두 자유롭게 메시지 교환
메시지 전송
- 메시지는 헤더와 페이로드로 구성된 프레임 단위로 전송
- 텍스트나 바이너리 형태로 직렬화 가능한 모든 데이터 전송 가능
- 실시간성: 지속적이고 낮은 지연 시간의 양방향 통신
- 효율성: 단일 연결로 서버 리소스 최적화
- 서버 푸시: 클라이언트 요청 없이 서버에서 콘텐츠 전송 가능
pub-sub 이라는 발행-구독 형태를 사용해 쉽게 메세지를 주고받을 수 있는 프로토콜
순수 WebSocket의 한계
WebSocket 프로토콜은 텍스트와 바이너리 두 가지 메시지 타입만 정의하지만, 메시지 내용은 정의하지 않음
즉, 개발자가 직접 메시지 형식과 라우팅을 구현해야 함
STOMP의 해결책
CONNECT, SUBSCRIBE, UNSUBSCRIBE, ACK, SEND 등의 프레임 타입을 제공하여 통신 관리를 단순화하고, 메시지 확인응답 같은 고급 기능을 구현할 수 있음
- 클라이언트 → STOMP.js로 WebSocket 연결
- WebSocket → 실시간 양방향 통신 제공
- 서버 → 받은 메시지를 Kafka로 전송
- Kafka → 메시지를 다른 서버 인스턴스들에게 배포
- 서버들 → Kafka에서 메시지를 받아 WebSocket으로 클라이언트들에게 전달