실시간 채팅 서비스 API 시스템 아키텍처 및 설계
2024. 12. 12. 16:51ㆍTIL
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에 저장 후 별도 처리.
- Apache Kafka:
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. 데이터 흐름
- 메시지 전송:
- 사용자가 메시지를 입력하고 전송 → GraphQL API로 메시지 백엔드에 전달.
- 백엔드에서 메시지를 저장한 후 Kafka 토픽에 메시지 이벤트를 발행.
- Kafka Consumer가 메시지를 수신하고 WebSocket 서버를 통해 수신자에게 메시지 전달.
- 메시지 상태 업데이트:
- 수신자가 메시지를 읽으면 상태를 업데이트 (DELIVERED → READ).
- Kafka를 통해 상태 변경 이벤트를 발행하고, 이를 클라이언트로 전송.
- 실패한 메시지 처리:
- Kafka의 DLQ로 이동한 메시지를 Worker가 재처리.
4. 확장 고려 사항
- 수평 확장:
- WebSocket 서버와 백엔드를 컨테이너화하여 Kubernetes로 배포.
- Kafka 클러스터를 활용해 높은 처리량을 지원.
- 모니터링:
- Grafana로 시스템 상태와 메시지 처리량 모니터링.
- 멀티미디어 메시지 지원:
- 이미지/비디오 업로드를 위한 S3 같은 스토리지 서비스 연동.
'TIL' 카테고리의 다른 글
GraphiQL (0) | 2024.12.16 |
---|---|
HJ CHAT 로그인/회원가입 API 작성 (0) | 2024.12.13 |
𝐆𝐫𝐚𝐩𝐡𝐐𝐋 𝐕𝐒 𝐑𝐄𝐒𝐓 𝐀𝐏𝐈 (0) | 2024.12.11 |
공공데이터 활용 프로젝트 마무리 및 제출 (1) | 2024.12.09 |
내 로컬에 있는 컨테이너 EC2로 업로드하기 (0) | 2024.12.08 |