Hello, Freakin world!

[채팅앱] 메세지 서버에서 치명적인 결함을 발견하다 본문

Toy Project/채팅 앱 만들기

[채팅앱] 메세지 서버에서 치명적인 결함을 발견하다

johnna_endure 2020. 4. 19. 17:36

프로젝트 막바지에 중요한 결함을 발견하고,

결국 코드를 리셋하기로 마음먹었습니다ㅠㅠ (남는게 시간인 백수라 쌉가능)

 

(빨리 완성하고 스프링 프로젝트를 시작하고 싶었지만...) 

 

결함은 허술한 아키텍쳐 설계가 원인이었습니다. 

하지만 이 당시엔 이벤트 방식의 논블로킹 서버에 대한 지식이 전무했기 때문에

어떻게보면 이와 같은 결정이 필연적인 수순 같기도 하네요.

 

문제점을 간단하게 설명하자면,

처음 설계된 구조는 서버에서 하나의 EventLoop(전달 받은 이벤트를 처리하는 스레드)를 이용해 모든 이벤트를 처리하려고 했습니다. 이렇게 할 경우, 이벤트를 read 하는건 상관없지만 write 해야되는 경우에 난감해집니다.

 

채팅방에 있는 사람들에게만 write하려면 채널들을 선별하는 과정이 필요합니다. 

고민해본 결과, 식별정보를 추가하고, write 작업마다 검색과정을 거치면 O(n^2)의 복잡도로 해결이 가능합니다. 하지만 채팅방 수가 늘어남에 따라 급격하게 느려질겁니다. 직관적으로 생각해도 하나의 채팅방 메세지를 보내는데 서버에 연결된 모든 채널을 순회하는 방식은 비효율적입니다.

 

 

개선사항

- ChatRoomServer와 통신하는 코드를 추가

- 채팅방 생성시 ChatServer에 메세지를 보내 RoomThread 생성 요청.

- ChatServer는 채팅방마다 RoomThread를 가지고, RoomThread는 각 하나의 EventLoop 스레드를 가집니다.

  

 

 

 

 

Comments