Kafka와 WebSocket을 활용한 실시간 데이터 전송 (1) - 개념 및 설계

도입배경

  • 실시간으로 변화하는 코인 데이터를 사용자에게 빠르게 제공하기 위해 HTTP API 방식을 사용하던 중, 다음과 같은 한계를 경험했습니다.

기존 HTTP API 방식의 문제점

  1. 지연시간 문제
  • 클라이언트가 데이터를 요청해야만 갱신되므로 실시간성이 부족
  1. 불필요한 네트워크 부하
  • 지속적인 HTTP Polling(주기적 요청)으로 서버 부하 증가
  1. 다수의 클라이언트 처리 어려움
  • 동시 접속자가 많을 경우, 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. 시스템 설계

전체 아키텍처 흐름

  1. 클라이언트 ↔ 서버 간 WebSocket 연결 유지
  2. 서버가 주기적으로 외부 암호화폐 Open API 호출하여 데이터 수집
  3. 수집된 데이터를 Kafka의 Producer가 Kafka에 전송(Produce)
  4. Kafka Broker는 여러 개의 백엔드 서버(Consumer 역할)로 데이터를 전송
  5. Consumer가 Kafka에서 데이터를 가져와 가공, WebSocket을 통해 클라이언트로 전송
  6. 클라이언트에서 실시간으로 코인 정보 랜더링

결론

  • 이번 포스트에서는 기존 HTTP API 방식의 한계점을 살펴보고, 이를 해결하기 위해 Kafka와 WebSocket을 활용한 실시간 코인 서비스의 설계를 다뤘습니다.
  • 다음 포스트에서는 실제 코드로 구현하여 Kafka Producer, Consumer, WebSocket 서버를 개발하는 과정을 다뤄보겠습니다.