실시간 채팅 서비스 API 시스템 아키텍처 및 설계

2024. 12. 12. 16:51TIL

ERD: https://www.erdcloud.com/d/pf3AX8xwAXmJSg8hy

 

HJCHAT

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

 

GraphQL API 명세서: https://www.notion.so/15aca8e7a66380869361cf74ecd37238?v=15aca8e7a663810d891f000c1f20adf4&pvs=4

 

1. 전체 시스템 아키텍처 개요

사용자 ↔ Gateway ↔ Backend ↔ Database/Kafka ↔ Worker 서비스

 

2. 주요 구성 요소

1. 프론트엔드 (웹/모바일 클라이언트)

  • 역할:
    • 사용자와의 인터페이스 제공.
    • GraphQL API를 통해 데이터 요청 및 메시지 전송.
    • WebSocket을 사용하여 실시간 메시지 수신.
  • 사용 기술:
    • React
    • Apollo Client (GraphQL 통합용).
    • WebSocket 또는 Socket.IO (실시간 메시지 수신).

2. API Gateway

  • 역할:
    • 클라이언트 요청을 처리하고 적절한 백엔드 서비스로 라우팅.
    • GraphQL 쿼리 요청 및 WebSocket 연결 관리.
  • 사용 기술:
    • GraphQL 서버: Apollo Server, Hasura 또는 Spring Boot GraphQL.
    • 인증/인가: OAuth2, JWT 토큰.

3. 백엔드 서비스

  • 역할:
    • 비즈니스 로직 처리 및 데이터베이스/Kafka 연동.
    • 메시지 저장, 채팅방 관리, 사용자 관리 기능 제공.
  • 사용 기술:
    • Spring Boot + Kotlin: GraphQL 엔드포인트와 Kafka 연동.
    • Kafka Producer/Consumer:
      • 메시지 큐에 메시지 추가.
      • 메시지 소비 후 상태 업데이트.
  • 주요 기능:
    • 메시지 처리:
      • 메시지 저장 후 Kafka에 전달.
    • 메시지 상태 관리:
      • PENDING → DELIVERED → READ 상태 전환 처리.
    • 채팅방 관리:
      • 채팅방 생성/수정/삭제.
      • 사용자 채팅방 참여 관리.

4. Message Queue 서비스 (Kafka)

  • 역할:
    • 메시지 전달 및 처리 이벤트를 비동기로 관리.
    • 메시지 처리 실패 시 재시도 로직 제공.
  • 사용 기술:
    • Apache Kafka:
      • 메시지 토픽 구성: 예) chat-messages, message-status.
      • Producer/Consumer로 메시지 이벤트 관리.
    • Retry 및 Dead Letter Queue (DLQ):
      • 실패한 메시지는 DLQ에 저장 후 별도 처리.

5. Worker 서비스

  • 역할:
    • Kafka의 메시지 이벤트를 소비하고, 메시지 전달을 담당.
    • 알림 서비스(SMS, 푸시 알림)와 통합.
  • 사용 기술:
    • Kafka Consumer (Spring Kafka 사용 가능).
    • 비동기 작업 처리: Spring Async, Redis Queue.

6. Database (PostgreSQL)

  • 역할:
    • 채팅방, 메시지, 사용자 데이터를 영구 저장.
  • 설계 요소:
    • Message 테이블: 채팅 메시지 저장.
    • Message_Queue 테이블: Kafka 메시지 상태 관리.
    • Chat_Room 및 Chat_Room_Member 테이블: 채팅방과 멤버 관계 관리.
  • 최적화:
    • 메시지 검색을 위한 created_at, chat_room_id 인덱스 추가.
    • 과거 메시지 아카이빙 시스템 도입.

7. 실시간 메시지 서버

  • 역할:
    • WebSocket을 통해 클라이언트와 실시간 메시지 송수신.
  • 사용 기술:
    • Spring Boot WebSocket.
    • Redis Pub/Sub:
      • 분산 환경에서 여러 WebSocket 서버 간 동기화.
  • 구조:
    • 클라이언트가 WebSocket을 통해 서버에 연결.
    • 메시지 수신 시 Kafka에 저장 후 다른 사용자에게 전달.

3. 데이터 흐름

  1. 메시지 전송:
    • 사용자가 메시지를 입력하고 전송 → GraphQL API로 메시지 백엔드에 전달.
    • 백엔드에서 메시지를 저장한 후 Kafka 토픽에 메시지 이벤트를 발행.
    • Kafka Consumer가 메시지를 수신하고 WebSocket 서버를 통해 수신자에게 메시지 전달.
  2. 메시지 상태 업데이트:
    • 수신자가 메시지를 읽으면 상태를 업데이트 (DELIVERED → READ).
    • Kafka를 통해 상태 변경 이벤트를 발행하고, 이를 클라이언트로 전송.
  3. 실패한 메시지 처리:
    • Kafka의 DLQ로 이동한 메시지를 Worker가 재처리.

4. 확장 고려 사항

  1. 수평 확장:
    • WebSocket 서버와 백엔드를 컨테이너화하여 Kubernetes로 배포.
    • Kafka 클러스터를 활용해 높은 처리량을 지원.
  2. 모니터링:
    • Grafana로 시스템 상태와 메시지 처리량 모니터링.
  3. 멀티미디어 메시지 지원:
    • 이미지/비디오 업로드를 위한 S3 같은 스토리지 서비스 연동.