ThreadPool 전환

멀티스레드 서버는 요청을 무한 스레드가 아니라 제한된 워커 큐로 보낸다

싱글스레드 서버는 느린 요청 하나가 뒤의 연결까지 막는다. 개선 순서는 병목을 재현하고, 요청 실행을 분리한 뒤, 고정된 워커 수와 큐로 폭주를 제어하는 쪽으로 잡는다.
느린 요청/sleep 같은 긴 작업이 뒤 요청을 기다리게 만든다. 무한 생성 금지연결마다 새 스레드를 만들면 장애 때 자원 고갈이 먼저 온다. 워커 큐작업은 큐로 보내고 고정 워커가 순서대로 가져간다.
싱글스레드에서 ThreadPool로 바꾸는 기준표
구간 문제 또는 역할 구현 단서 주의점
느린 요청 하나의 요청이 파일 읽기, 대기, 외부 I/O로 오래 걸린다. 단일 루프에서 handle_connection이 끝날 때까지 다음 연결이 멈춘다. 응답 지연이 다른 사용자에게 그대로 전파된다.
요청별 실행 연결 처리를 메인 수락 루프와 분리한다. thread::spawn으로 빠르게 효과를 확인한다. 요청 폭주 때 스레드가 제한 없이 늘 수 있다.
ThreadPool 동시에 일할 워커 수를 서버가 정한 값으로 제한한다. ThreadPool::new(size)가 워커와 큐를 준비한다. 큐 적체, 종료 신호, 워커 회수 정책을 함께 설계한다.
execute 요청별 작업을 클로저로 감싸 큐에 넣는다. pool.execute(|| handle_connection(stream)) 작업 panic과 채널 종료가 서버 전체로 번지지 않게 본다.
Worker 큐에서 작업을 받아 반복 실행한다. id, 수신기, JoinHandle을 묶어 추적한다. 종료 시 대기 중인 작업과 실행 중인 작업을 구분한다.
Queue수락 속도와 처리 속도의 차이를 흡수한다.
Workers동시 실행량을 메모리와 CPU 한도 안에 둔다.
Backpressure큐가 길어지는 상황을 지연이나 거절 정책으로 드러낸다.
Shutdown송신기 drop 뒤 워커를 join해 누수를 줄인다.