일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- docker-compose
- 서비스 디스커버리
- 백트래킹
- 도커
- 유레카
- 완전 탐색
- 이분 매칭
- Zuul
- 트리
- 다익스트라
- 플로이드 와샬
- spring boot
- 메모이제이션
- 스프링 시큐리티
- 스택
- 비트마스킹
- spring cloud
- 주울
- 달팽이
- 구현
- dp
- Java
- 이분 탐색
- Gradle
- Spring Cloud Config
- Logback
- 게이트웨이
- ZuulFilter
- BFS
- 구간 트리
- Today
- Total
Hello, Freakin world!
[채팅앱] 최종 완성된 아키텍쳐 본문
여러 수정을 하다보니 초기의 설계와는 완전히 달라졌네요.
우선 그림으로 살펴보도록 하겠습니다.
서버는 크게 ChatRoomServer 와 ChatServer. 두 가지가 있습니다.
채팅룸 서버(ChatRoomServer) : 채팅방의 정보(방이름, 현재 인원수, 최대 인원수, id)를 관리하는 서버입니다.
채팅메세지 서버(ChatServer) : 읽은 채팅 메세지를 같은 방의 모든 인원에게 다시 보내주는 역할의 서버입니다. 채팅은 이 서버를 통해 이루어집니다.
이렇게 서버를 두 가지로 분리시켰던 이유는 솔직히 말하자면 이벤트방식으로 모든 요청을 처리하기가 난감했기 때문이었습니다. 채팅룸 서버는 동기방식의 논블로킹 방식(자바 서블릿이 웹 요청을 처리하는 방식)이고, 채팅 메세지 서버는 이벤트 방식의 논블로킹 방식으로 통신합니다.
초기에 이벤트 방식으로만 서버를 구성하려고 시도했으나, 한계에 부딪히고 이 방식만으로 서버를 구성하기에는 한계가 있다고 느꼈습니다.
이제 각 서버의 아키텍쳐를 조금 더 자세히 살펴보도록 하겠습니다.
채팅룸 서버
설명
accept 된 소켓들은 스레드풀의 스레드에 넘겨지게 됩니다. 그리고 넘겨진 스레드에서 읽기/가공/쓰기 작업들이 이루어집니다. 가공된 정보는 가상의 데이터베이스인 리스트 컬렉션에 저장됩니다.
채팅메세지 서버
설명
이 부분이 가장 고심했던 부분입니다. '클라이언트들을 채팅방으로 어떻게 구분해서 통신할 것인가?' 라는 문제였습니다.
결국 RoomThread 라는 내부에 ServerSocketChannel을 가지고 있는 스레드 단위를 도입하게 됐습니다. 같은 방에 속하는 클라이언트들은 이 RoomThread에 연결되어 서로 통신하게 됩니다.
이렇게 하기 위해서 지금 구현된 바로는 클라이언트가 RoomThread의 통신 포트번호를 직접 알아야 합니다.
과연 이 방식이 맞는건지는 잘 모르겠네요.
그리고 이 두 서버들이 서로 요청을 보내는 경우도 있습니다.
채팅방이 생성/삭제 되는 경우 RoomThread 역시 같이 생성/삭제 되어야 하기 때문입니다.
그러기 위해서는 RoomThreadPool을 조작하는 요청을 받기 위해서 하나의 포트가 더 필요합니다만,
위 그림에서는 깜빡하고 빠뜨렸습니다;; 그 포트는 RoomThreadPool을 조작하기 위한 API를 제공합니다.
전체 코드
github.com/johnna-endure/chatting-project-entire
'Toy Project > 채팅 앱 만들기' 카테고리의 다른 글
[채팅앱] 드디어 완성하다 우오오오오오오옷!!!! (0) | 2020.05.02 |
---|---|
[채팅앱] 메세지 서버에서 치명적인 결함을 발견하다 (0) | 2020.04.19 |
[채팅앱] 클라이언트와 채팅룸 서버 1차 연결 완료 (0) | 2020.04.16 |
[채팅앱] 자바 모듈 프로그래밍의 필요성을 느끼다 (0) | 2020.04.14 |
[채팅앱] 채팅룸 서버 테스트 추가 및 진행 상황 (0) | 2020.04.08 |