Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

103 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

채팅서비스

이 프로젝트는 node.jsSocket.IO 를 활용하여 실시간 양방향 채팅을 구현한 서비스 입니다. 이 서비스는 Kafka, Redis, ScyllaDB 등을활용하여 채팅의 무결성, 순서, 동시성 을 보장하고, 오프라인 유저 판별, 채팅 데이터 저장, 페이지네이션 기능을 포함하였습니다.

개발 기간

  • 2024년 11월 26일 ~ ing

기능

  • 실시간 양방향 채팅: Node.jsSocket.IO를 사용하여 실시간으로 메시지를 주고받는 기능을 제공합니다.
  • 메시지 무결성 보장: Kafka를 사용하여 채팅 메시지의 순서와 동시성을 보장합니다.
  • 오프라인 유저 판별: Redis를 사용하여 오프라인 유저를 판별하고, gRPC를 통해 오프라인 상태인 유저에게 알림을 전송합니다.
  • 유저와 소켓 맵핑: 하나의 유저 아이디로 여러 개의 소켓 연결을 구분하기 위해 Redis에서 유저와 소켓 아이디를 mapping하여 저장합니다.
  • 채팅 데이터 저장: ScyllaDB를 사용하여 대용량 채팅 데이터를 저장합니다.
  • 페이지네이션: 최신순으로 채팅 데이터를 불러오고, 페이지네이션 기법을 활용하여 이전 데이터와 새 데이터를 효율적으로 로드합니다.

기술 스택

  • Node.js: 서버 사이드 로직
  • Socket.IO: 실시간 채팅 구현
  • Kafka: 메시지의 무결성, 순서 및 동시성 보장
  • Redis: 오프라인 유저 판별 및 소켓 아이디 맵핑 저장
  • ScyllaDB: 채팅 데이터 저장
  • gRPC: 오프라인 유저에게 알림 전송
  • Swagger: API 문서 제공

주요 기능 설명

1. 실시간 양방향 채팅 (Socket.IO)

  • Socket.IO를 사용하여 서버와 클라이언트 간 실시간 양방향 채팅을 구현합니다.
  • 클라이언트는 서버와 연결된 후 메시지를 주고받을 수 있습니다.

2. 메시지 무결성 및 순서 보장 (Kafka)

  • Kafka를 사용하여 채팅 메시지가 제대로 처리되도록 보장합니다.
  • Kafka는 메시지 순서동시성 문제를 해결합니다.

3. 오프라인 유저 판별 (Redis & gRPC)

  • Redis는 유저의 상태(온라인/오프라인) 정보를 저장합니다.
  • 클라이언트가 서버에 연결되지 않으면 오프라인으로 처리되며, 이 상태에서는 gRPC를 통해 알림이 전송됩니다.

4. 유저와 소켓 아이디 맵핑 (Redis)

  • 하나의 유저 아이디로 여러 개의 소켓 연결을 관리할 수 있습니다.
  • 예를 들어, 웹과 모바일에서 동일한 유저가 여러 소켓을 연결할 수 있습니다.
  • Redis는 유저 아이디와 소켓 아이디를 mapping하여 관리합니다.

5. 채팅 데이터 저장 (ScyllaDB)

  • 모든 채팅 메시지는 ScyllaDB에 저장됩니다.
  • ScyllaDB는 NoSQL 기반의 데이터베이스로, 빠른 쓰기 성능을 제공합니다.

6. 페이지네이션

  • 채팅 데이터를 최신순으로 불러오며, 사용자가 스크롤을 내리면 페이지네이션을 통해 새로운 데이터를 가져올 수 설계하였습니다.
  • 이전 데이터를 불러올 때는 마지막 데이터를 기준으로 limit 갯수만큼 불러오는 방식입니다.

About

채팅서비스

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages