Connection timeout vs Connection request timeout vs Socket timeout

blackdog·2021년 9월 12일
0
post-thumbnail

목적

Apache Http Client를 사용하던 도중, 이름이 비슷하여 헷갈리는 timeout들이 있어서 간략하게 정리한다.

Connection timeout

클라이언트가 서버와 커넥션을 맺을 때 까지의 timeout 이다. 3-way handshake 까지 걸리는 시간이라고 생각하면 된다.

발생 사례

보통 여기에서 timeout이 난다면, 요청받은 서버가 정상 상태가 아닐 확률이 높다. (아니면 잘못된 endpoint로 요청했거나..)

Connection request timeout

connection pool로부터 connetion을 대여하기까지의 timeout이다. connection pool에 connection을 요청한 뒤, 일정 시간이 지나도 connection을 받지 못했을 경우에 해당 timeout이 발생한다.

발생 사례

이 timeout이 발생하는 경우는 여러가지가 있을 것이다. Apache Http Client의 connection pool에서는 max total connection과 max route를 지정할 수 있는데, 이 설정들의 의미는 아래와 같다.

  • max total connection : connection pool이 가질 수 있는 최대 connection 수
  • max route : (connection pool 이 관리하는 connection 중) 동일한 endpoint로 동시에 요청할 수 있는 최대 connection 수

그래서 지금 생각나는 발생 사례를 간단히 적어보자면,

1. max total connection이나, max route를 너무 적게 설정한 경우
이 상태에서 단 시간에 많은 요청을 보내게 되면, 요청을 보내기 위해 connection을 받으려고 대기하다가 이 timeout 이 발생하게 된다.

2. 타겟 서버의 데이터 처리 시간이 길게 소요되거나, 큰 크기의 파일을 다운로드 받는 경우
이 경우는 connection이 오래동안 할당되므로, 타겟 서버의 응답 시간이 짧은 경우 보다 connection 수를 더 크게 설정할 필요가 있다.

3. response의 자원을 해제하지 않아서 connection이 pool에 반납되지 못하고 계속 물려있는 경우
Apache Http Client에서는 request를 보내고 response를 받고 나면 response의 consume()을 호출해서 response의 자원(inputStream)을 해제해야 한다. 그렇지 않으면 connection은 pool로 반납되지 못하고, 금방 max connection 수에 도달하게 되어 timeout이 발생하게 된다.

Socket timeout

http packet과 packet 사이의 시간 간격에 대한 timeout이다. http 통신은 일정 크기의 packet을 여러 번에 걸쳐 보내며 이루어지는데, 이 packet들 간 일정 시간이 벌어지게 되면 timeout이 발생하게 된다.

발생 사례

가장 먼저 네트워크 이슈가 있을 것이다. 연결 중간에 네트워크에 이상이 생겼거나, 서버가 응답 도중에 불의의 사고(?)로 갑자기 connection close를 보내지 못하고 갑자기 내려갔을 수도 있다.

또 다른 경우로는 connection이 정상적으로 맺어진 이후, 응답을 보내기까지 시간이 오래 걸리는 경우이다. 만약 큰 파일을 응답으로 내려주는 서버가 있을 경우, 해당 파일을 준비하는데 까지 시간이 오래 걸릴 수 있기 때문이다. (해당 서버가 DB나 object storage로 부터 파일을 가져오고 처리하는 시간을 모두 거친 다음에 전송이 시작될 것이기 때문에)

위와 같은 경우를 고려하여 회사 업무에서는 응답으로 큰 파일을 돌려주는 서버로 요청할 때는 socket timeout을 길게 잡아놨다. 응답 데이터 전송이 시작된 이후에는 socket timeout이 발생할 확률이 적겠으나, 응답 데이터 전송 시작 전에 타겟 서버에서 응답 데이터를 만들기 위한 시간적 여유를 두는 것이다.

profile
검둥검둥 검둥개

0개의 댓글