RPC 프레임워크 맨땅에서 헤딩하기 3탄

emptynote의 이미지

부재 : 큐와 쓰레드 그리고 메시지 순서 보장

나의 첫번째 서버는 cpu 100% 치고 올라가는것도 문제지만

또 다른 문제를 갖고 있습니다.

나의 첫번째 서버는 쓰레드간 큐를 공유하는 방식으로

1개이상 입력 메시지 처리기 -- 1개 큐 -- 1개이상 비지니스 로직 처리기 -- 1개 큐 -- 1개이상 출력 메시지 처리기

와 같은 구조를 갖습니다.

이렇게 설계한 이유는 병렬성을 극대화 하기 위해서였습니다.

그런데 여기서 문제가 있습니다.

채팅을 한다고 합시다. A 가 첫번째 메시지를 보낸후 다시 두번째 메시지를 보내면

같은 채팅방에 있는 B 한테 A 의 첫번째 메시지와 두번째 메시지를 순서대로 받는것을 보장 할 수 있을까요?

답은 도착한 메시지 순서를 보장 할 수 없다 입니다.

왜냐하면 동일한 로직을 수생하는 쓰레드라도 큐에 의해 먼저 깨어난 쓰레드의 일부분만 실행되고 그 다음 로직은 언제 실행될지 모릅니다.

이 말은 A 의 첫번째 메시지를 받은 쓰레드가 받은것까지만 실행하고 보류되어

두번째 메시지를 받은 쓰레드는 B 한테 받은 메시지를 보내고 종료하고

다시 A 가 깨어나 B 한테 받은 메시지를 보내고 종료하여

결국 B 는 두번째 메시지를 먼저 받고 다음 첫번째 메시지를 받게 된다는 말입니다.

나의 첫번째 서버는 2가지 문제점을 갖고 있습니다.

첫번째는 socket#write 시 즉각적으로 0을 반환하며 무한 루프 돌아 cpu 100% 치고 올라가는 문제
두번째는 수신한 메시지의 처리 순서 보장

저는 이것을 해결하기 위해서 싱글 쓰레드 서버로 구조를 변경을 하였습니다.

싱글 쓰레드 서버가 무적이냐? 아닙니다. 저는 아직도 해결 못한 여러가지 문제점을 갖고 있습니다.

싱글 쓰레드 서버의 가장 큰 문제가 오래 걸리는 작업이 있다면 그때문에 그 시간 만큼 전체적으로 다 지연된다는것입니다.

고성능 서버를 위해서 이런 고민은 오래 전부터 해 왔기에 그런 고민이 녹아져 있는 서버에 비하면

제 서버는 형편 없지만 그러함에도 불구하고 저와 함께 싱글 쓰레드 서버 개선하는데 참여하겠다는 분이 계시다면 환영합니다.

참여의 전제 조건은 아파치2 라이센스이며 제 이메일 주소는 k9200544@hanmail.net 입니다.

싱글 쓰레드 서버 이야기는 다음에 하도록 하겠습니다.

-----------

코다 베타 사이트 : www.sinnori.pe.kr

github 사이트 : https://github.com/madang01/gitmadang

clone or downlaod : https://github.com/madang01/gitmadang.git