• 카테고리

    질문 & 답변
  • 세부 분야

    네트워크

  • 해결 여부

    해결됨

안녕하세요 선생님!

23.06.20 03:27 작성 23.06.20 03:42 수정 조회수 238

0

유튜브,강의 잘 보고 있습니다!

다름이 아니라 한가지 궁금한 점이 생겨서 질문드립니다!

제가 프로젝트를 진행하며 SSE(Server Sent Event) 라는 기술을 이용하여

사용자에게 특정 이벤트 발생 시 푸시알림을 주는 부분을 구현한 적이 있습니다

당시에는 문제없이 동작하여 대수롭지 않게 넘어갔지만! 네트워크 , http를 공부하며 든 생각인데..

SSE는 http의 persistence connection이라는 것 덕분에 가능하다라는 것 까지는 도달했으나

여기서 든 궁금증이 기존에 제가 가지고 있는 정보가

  1. 톰캣 서버는 기본적으로 따로 설정해주지 않으면 쓰레드풀을 200크기 만큼 가진다.

  2. 연결이 지속되어 있기 때문에 요청이 오지 않았지만 이벤트가 발생하면 해당 호스트에게 푸시알림이라는 형태로 응답이 가능하다.

여기서 연결이 지속되어 있다는 의미는 연결을 지속하기 위해 쓰레드가 반환되지 못하고 있음을 뜻한다고 생각하는데 그렇게 되면 특정 케이스에서 모든 쓰레드가 연결지속을 위해 반환되지 않은 상황이라면 다음 요청에 대해서 응답할 수 없어 큐에서 대기해야만 하는 상황이 생기는 것인가? 하는 궁금증입니다.


단순히 이런 상황일 때 쓰레드풀에 쓰레드더 만드나? 라는 생각은

  • 컨텍스트 스위칭 관련해서 복잡한 문제라 쓰레드 숫자를 마음대로 하지는 않을 것이라 생각되고

제가 생각한 문제가 맞다면 SSE로 실제 서비스하는 곳은 없지 않을까..? 라는 생각이 들고 프로젝트에 대한 아쉬움이 조금 남아서.. 폴링 방식처럼 계속 서버에게 이벤트가 발생되었는지 확인하는 방식이 차라리 더 나을 수 있다는 생각도 들어서요!

 

답변 1

답변을 작성해보세요.

0

본 강의와 큰 관련이 없는 질문이며 무엇보다 제가 잘 아는 영역이 아니라 일정 수준 추측으로 말씀드립니다.

톰캣 서버가 연결을 지속하기 위해 스레드를 여럿 생성하고 풀로 관리하고 있는 것은 분명히 성능과 효율때문일 것입니다. 그리고 연결이 지속된다는 부분에 있어서 이 연결이 TCP 연결인지 모르겠습니다. HTTP 사용자 세션을 의미하는 것일 수도 있고요. 아무튼 연결이 지속되고 말고는 OS 수준에서 판단할 일입니다.

보통 서버들은 윈도우의 경우 IOCP, Linux의 경우 epoll 등을 적용해 소켓 통신을 비동기 처리해 성능향상을 도모합니다. 이 때, 비동기 처리를 담당하는 스레드들은 처리해야 할 데이터가 있을 때만 작동하고 평상시에는 슬립 상태(혹은 Alertable wait 상태)입니다. 만일 풀에 준비된 스레드가 200개라면 200개의 입/출력 처리가 동시 진행이 가능함을 의미합니다.

200개가 모두 처리 작업을 진행하고 있다면 201번 입/출력 처리는 대기상태가 되며 200개 스레드 중 하나라도 처리가 완료된다면 대기상태 입/출력 요청건을 여유가 생긴 스레드가 처리하게 됩니다.