도입배경
- 실시간으로 변화하는 코인 데이터를 사용자에게 빠르게 제공하기 위해 HTTP API 방식을 사용하던 중, 다음과 같은 한계를 경험했습니다.
기존 HTTP API 방식의 문제점
- 지연시간 문제
- 클라이언트가 데이터를 요청해야만 갱신되므로 실시간성이 부족
- 불필요한 네트워크 부하
- 지속적인 HTTP Polling(주기적 요청)으로 서버 부하 증가
- 다수의 클라이언트 처리 어려움
- 동시 접속자가 많을 경우, API 처리로 인해 서버의 응답 속도 저하
해결 방법: Kafka + WebSocket 도입
- WebSocket을 활용하여 클라이언트와 서버 간 실시간 양방향 통신 가능, 클라이언트가 요청하지 않아도 서버에서 데이터 전송
- Kafka를 도입하여 여러 백엔드 서버에 분산 처리 및 확장성(Scalability) 보장
- 여러 개의 백엔드 서버 인스턴스가 존재하더라도 Kafka를 통해 일관된 데이터 전송 가능
1. Kafka 란?
- Kafka는 분산 스트리밍 플랫폼으로, 대량의 데이터를 빠르고 안정적으로 처리할 수 있는 메시지 브로커입니다.주요 개념
Producer
- 데이터를 생산하여 Kafka 의 Broker로 전송하는 역할
- 데이터를 Broker의 특정 Topic으로 전달
Broker
- Kafka 클러스터를 구성하는 일종의 서버
- Producer 에서 전달받은 데이터를 Topic 단위로 저장, Consumer에게 전달하는 역할
- 다중브로커 사용시 고가용성, 확장성 보장
Topic
- 데이터가 저장되는 논리적인 단위입니다.
- 직접 데이터를 저장하지는 않습니다.
- Topic은 여러개의 Partition으로 나뉘어 분산처리 가능합니다.
Partition
- 토픽 내부의 데이터가 분산 저장되는 물리적인 단위입니다.
- 파티션은 여러개의 Broker에 복제되어 저장되어 장애대응이 가능합니다.
Consumer
- 특정 Topic을 구독(Subscribe) 하여 전송되는 데이터를 소비합니다.
- Consumer가 데이터 처리하여도 Kafka는 데이터를 삭제하지 않습니다.
2. WebSocket 이란?
- WebSocket 은 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 하는 프로토콜 입니다.
- 주로 실시간 채팅 서비스, 주식 차트, 게임 데이터 동기화 등 실시간 데이터 전송이 필요한 곳에서 사용됩니다.
주요 특징
양방향 통신(Full Duplex)
- 서버와 클라이언트가 동시에 데이터를 주고받을 수 있습니다.
- HTTP 통신의 Request-Response 와 달리 서버도 자발적으로 데이터 전송 가능합니다.
연결 지속(Persistent Connection)
- HTTP Request는 매번 새로운 TCP 연결을 생성하지만, WebSocket은 연결을 맺으면 계속 유지됩니다.
- 이로인해 API를 통한 통신보다 네트워크 오버헤드(Network Overhead)가 감소 됩니다.
낮은 지연시간
- HTTP Polling 방식(클라이언트가 주기적으로 HTTP 요청) 과 달리, 헤더가 없어 훨씬 빠르고 효율적입니다.
- 데이터를 필요할 때만 보내므로 불필요한 요청을 줄일 수 있습니다
3. 시스템 설계
전체 아키텍처 흐름
- 클라이언트 ↔ 서버 간 WebSocket 연결 유지
- 서버가 주기적으로 외부 암호화폐 Open API 호출하여 데이터 수집
- 수집된 데이터를 Kafka의 Producer가 Kafka에 전송(Produce)
- Kafka Broker는 여러 개의 백엔드 서버(Consumer 역할)로 데이터를 전송
- Consumer가 Kafka에서 데이터를 가져와 가공, WebSocket을 통해 클라이언트로 전송
- 클라이언트에서 실시간으로 코인 정보 랜더링
결론
- 이번 포스트에서는 기존 HTTP API 방식의 한계점을 살펴보고, 이를 해결하기 위해 Kafka와 WebSocket을 활용한 실시간 코인 서비스의 설계를 다뤘습니다.
- 다음 포스트에서는 실제 코드로 구현하여 Kafka Producer, Consumer, WebSocket 서버를 개발하는 과정을 다뤄보겠습니다.