1 Chatting
- 채팅 서비스는 크게 세 가지 핵심 부분으로 구성됩니다
- HTTP API Server
- 채팅 서버(접속 상태 서버)
- 푸시 알림 서버
1.1 HTTP API Server
- API 서버는 로그인, 등록, 사용자 프로필 표시와 같은 전통적인 요청/응답 작업을 관리하는 무상태 서비스로 운영됩니다.
- 로드 밸런서 뒤에 위치하며, 사용자 상태 정보를 유지하지 않고 사용자 요청을 효율적으로 처리합니다.
1.2 채팅 서버(접속 상태 서버)
- API 서버와 달리 채팅 서버는 상태를 유지하며, 각 클라이언트가 지속적인 네트워크 연결을 유지합니다.
- 이 설계는 클라이언트가 동일한 서버에 지속적으로 연결되어 있도록 하여 메시지 일관성과 실시간 통신 기능을 향상시킵니다.
- 서버는 로드를 분산하고 연결 라우팅을 효과적으로 관리하기 위해 서비스 발견 메커니즘(예: Apache Zookeeper)을 활용합니다.
1.3 푸시 알림 서버
- 푸시 알림 서버는 사용자가 오프라인이거나 비활성 상태일 때 메시지를 전달하는 데 있어 중요합니다.
- 이를 통해 사용자가 새 메시지와 참여에 대해 계속 정보를 받을 수 있도록 하여 전반적인 사용자 경험을 향상시킵니다.
2 저장소
- 채팅 서비스의 데이터 저장소는 사용자 관련 데이터를 위한 관계형 데이터베이스와 채팅 내역 및 메시지를 처리하기 위한 NoSQL 데이터베이스의 조합입니다.
- 이 접근법은 데이터 무결성, 확장성 및 빠른 접근을 위한 최근 및 자주 사용되는 정보의 균형을 맞춥니다.
- 사용자 프로파일, 설정, 친구 목록과 같은 데이터는 안정성을 보장하는 관계형 데이터베이스에 저장
- 채팅 시 스템 고유의 데이터 즉 채팅 이력은 어디에 저장할 것인가?
- 채팅 이력 데이터는 양은 엄청나다.
- 이 데이터 중 빈번하게 사용된ㄴ 것은 최근 메시지이다.
- 검색 기능을 사용해 특정 사용자가 언급된 메시지를 보거나 특정 메시지로 점프하는 무작위적인 데이터 접근을 하기도 한다.
- 1:1 채팅의 경우 읽기 쓰기 비율이 대략 1:1이다
3 데이터 모델
- 채팅 시스템의 데이터 모델은 메시지의 고유성과 적절한 시간 순서를 보장하면서 일대다 통신 시나리오를 효과적으로 처리할 수 있어야 합니다
3.1 메시지 ID
- 메시지 ID가 충족해야할 조건
- ID는 고유해야 한다.
- 정렬 가능해야 하며 시간 순서와 일치해야 한다.
- 즉 새로운 ID는 이전 ID보다 큰 값이어야 한다.
- [[Unique-Id-Generator]] 참고
4 흐름
4.1 서비스 탐색 과정