vb.net을 활용하여 간단한 다중스레드 서버 프로그램을 구현해보았습니다.
이론상 100개의 연결을 동시에 처리하는 프로그램인데, 총 3개의 쓰레드로 구성됩니다.
메인 쓰레드 1번
클라이언트 연결 대기 쓰레드 2번
클라이언트 연결시 데이터를 send/receive하는 쓰레드 3번
1번 쓰레드는 1번째(cnt as integer = 1) 클라이언트 연결을 기다리는 2번 쓰레드를 생성.
2번 쓰레드는 AcceptTcpClient()로 계속 대기 하다가 클라이언트의 연결이 감지되면 3번 쓰레드를 생성 후
자신은 cnt값을 +1하여 두 번째 클라이언트의 연결 대기를 하는 무한 loop 구조입니다.
3번 쓰레드는 클라이언트(cnt) 객체 생성후 send, receive를 수행하고 클라이언트를 disconnect() 한 후 종료합니다.
즉, 1개의 리스너 스레드가 동시에 1개의 연결만 받고 순차적으로 연결을 처리하나,
연결이 완료된 후 데이터의 처리는 다중스레드로 동시에 처리하는 방식입니다.
문제는,
클라이언트 연결이 많지 않은 소규모의 서버에서는 잘 돌아가는 것 같은데,
동시에 연결 횟수가 급증한다거나, 항상 연결시도가 많은 경우라면 문제가 많이 발생할 것 같습니다.
예를들어 2번 스레드가 첫번째 클라이언트의 연결을 처리하고 두번째 클라이언트 연결을 기다리는 시간이 0.05초 인데,
0.05초내에 연결 시도가 10건이 들어왔다면, 처리가 정상적으로 이루어지지 않을거 같은데요
그렇다고 리스너 스레드를 동시에 10개 100개씩 돌려놓기엔 시스템적으로 무리가 따를때
이런 경우 어떻게 설계하는지 정말 궁금합니다.
서버 프로그램이 만드는 재미가 있으면서도 생각해야할게 정말 많네요.