Skip to content

3주차 학습정리 ‐ 유동근

유동근 edited this page Jul 14, 2024 · 3 revisions

Java NIO Selector

톰켓의 NIOEndpoint.java를 분석하는 중에 만난 Selector라는 처음 보는 클래스는 하나의 스레드가 여러개의 채널을 관리할 수 있게 해주는 NIO 컴포넌트이다.
NIO Connector의 특징은 하나의 요청에 하나의 스레드가 매핑되어 실행되는 것이 아니라는 것이다. 다시말해 최대 스레드를 초과한 요청을 처리할 수 있는 능력을 가지고 있다. 이것을 가능하게 해주는 것이 바로 Selector 컴포넌트이다.

image

하나의 체널(커넥션)을 하나의 스레드에서 관리하게 되면 커넥션이 늘어나는 만큼 스레드 리소스가 필요하다. 때문에 많은 요청을 동시에 처리하기에는 한계가 생긴다.

image

하지만 Selector를 적용하면 하나의 스레드에서 여러개의 커넥션을 관리할 수 있다. 때문에 적은 리소스만으로도 동시에 많은 요청을 관리하는 것이 가능해진다.

Connection timeout과 socket timeout

Connection Timeout

커넥션을 생성하기까지 대기할 수 있는 최대 대기 시간을 말합니다.

Socket Timeout

데이터를 전송할 때, 하나의 패킷으로 전송 가능한 경우도 있지만 패킷의 최대 크기는 제한적이기 때문에 여러개의 패킷으로 분리되어서 전송된다. 이 때, 패킷을 전송하면서 다음 패킷이 전송을 위해서 대기하는 시간이 필요하다 이때의 최대 대기시간을 socket timeout이라고 한다.

Read Timeout 관계

서버와 클라이언트간의 연결이 맺어졌지만 I/O 작업이 길어지거나 lock이 걸려 요청이 처리되지 못하고 있을 때 Client가 더 이상 응답을 기다리지 않고 종료한다. 이 때, Client 가 대기하는 최대 대기시간을 Read Timeout이라고 합니다.

TCP keepAlive vs HTTP keepAlive

HTTP keep-alive

image

http keep alive는 특정 시간 동안 유지되는 커넥션을 만들고 만약 사용이 되지 않는다면 그 연결을 해제하는 방식이다.

http 1.0에서는 Connection 헤더를 통해서 지속 커넥션 사용을 명시할 수 있다.

Connection: Keep-alive // 연결 유지
Connection: close // 연결 종료

그리고 지속 커넥션에 대한 설정 정보를 입력할 수 있다.

Keep-Alive: timeout=5, max=1000

http 1.1에서는 디폴트로 지속 커넥션을 사용하기 때문에 http 메시지에서 지속 커넥션 생성을 위한 헤더를 입력할 필요는 없다.

TCP keep-alive

image

tcp keep alive는 불가능하지 않다면 계속해서 연결을 지속하려고 한다. 때문에 tcp keep alive에서는 timeout 값을 설정하지 않는다. 현재의 연결이 신뢰적인지를 지속적으로 확인을 해서 최대한 연결을 유지한다. 만약 네트워크가 불안정해서 연결이 불가능한 상황이 발생한다면 probes까지 연결 확인 요청을 진행하고 실패하면 연결을 종료시킨다.

image

java.net의 Socket에서는 위의 함수를 통해서 keep-alive 설정을 할 수 있다.

참고

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally