이 프로젝트는 node.js 와 Socket.IO 를 활용하여 실시간 양방향 채팅을 구현한 서비스 입니다. 이 서비스는 Kafka, Redis, ScyllaDB 등을활용하여 채팅의 무결성, 순서, 동시성 을 보장하고, 오프라인 유저 판별, 채팅 데이터 저장, 페이지네이션 기능을 포함하였습니다.
- 2024년 11월 26일 ~ ing
- 실시간 양방향 채팅:
Node.js와Socket.IO를 사용하여 실시간으로 메시지를 주고받는 기능을 제공합니다. - 메시지 무결성 보장: Kafka를 사용하여 채팅 메시지의 순서와 동시성을 보장합니다.
- 오프라인 유저 판별:
Redis를 사용하여 오프라인 유저를 판별하고, gRPC를 통해 오프라인 상태인 유저에게 알림을 전송합니다. - 유저와 소켓 맵핑: 하나의 유저 아이디로 여러 개의 소켓 연결을 구분하기 위해
Redis에서 유저와 소켓 아이디를 mapping하여 저장합니다. - 채팅 데이터 저장:
ScyllaDB를 사용하여 대용량 채팅 데이터를 저장합니다. - 페이지네이션: 최신순으로 채팅 데이터를 불러오고, 페이지네이션 기법을 활용하여 이전 데이터와 새 데이터를 효율적으로 로드합니다.
- Node.js: 서버 사이드 로직
- Socket.IO: 실시간 채팅 구현
- Kafka: 메시지의 무결성, 순서 및 동시성 보장
- Redis: 오프라인 유저 판별 및 소켓 아이디 맵핑 저장
- ScyllaDB: 채팅 데이터 저장
- gRPC: 오프라인 유저에게 알림 전송
- Swagger: API 문서 제공
- Socket.IO를 사용하여 서버와 클라이언트 간 실시간 양방향 채팅을 구현합니다.
- 클라이언트는 서버와 연결된 후 메시지를 주고받을 수 있습니다.
- Kafka를 사용하여 채팅 메시지가 제대로 처리되도록 보장합니다.
- Kafka는 메시지 순서와 동시성 문제를 해결합니다.
- Redis는 유저의 상태(온라인/오프라인) 정보를 저장합니다.
- 클라이언트가 서버에 연결되지 않으면 오프라인으로 처리되며, 이 상태에서는 gRPC를 통해 알림이 전송됩니다.
- 하나의 유저 아이디로 여러 개의 소켓 연결을 관리할 수 있습니다.
- 예를 들어, 웹과 모바일에서 동일한 유저가 여러 소켓을 연결할 수 있습니다.
- Redis는 유저 아이디와 소켓 아이디를 mapping하여 관리합니다.
- 모든 채팅 메시지는 ScyllaDB에 저장됩니다.
- ScyllaDB는 NoSQL 기반의 데이터베이스로, 빠른 쓰기 성능을 제공합니다.
- 채팅 데이터를 최신순으로 불러오며, 사용자가 스크롤을 내리면 페이지네이션을 통해 새로운 데이터를 가져올 수 설계하였습니다.
- 이전 데이터를 불러올 때는 마지막 데이터를 기준으로 limit 갯수만큼 불러오는 방식입니다.