티스토리 뷰

spring 에서 제공해주는 RestTemplate 이나 RestClient 를 사용한다면 코어 http 클라이언트로 apache httpcomponents client 를 많이 사용한다. 다양한 설정을 제공해고, 특히 http connection pool 을 제공해주는게 매력적인데 RestClient 와 함께 설정하는 방법은 이전에 적은 글이 있다.

 

이번 글에선 각 timeout 과 해당 timeout 이 발생했을때 connection pool 의 동작을 알아본다.

 

# Timeout

RequestConnectionTimeout

connection pool 에서 connection 을 가져오기까지 대기하는 시간

connection pool 이 작아 모든 connection 이 사용중인 경우 해당 timeout 설정으로 인해 예외 발생

 

ResponseTimeout

응답의 첫번째 바이트를 받기까지 대기하는 시간

 

ConnectTimeout

connection 을 맺기까지 대기하는 시간

TCP 핸드쉐이크가 오래 걸리면 예외 발생

 

SocketTimeout

응답을 받기 시작한 이후 바이트 사이사이를 대기하는 시간

지속적으로 바이트가 timeout 설정 이내로 도착한다면 전체 응답시간은 response timeout 이나 socket timeout 설정값을 초과할 수 있음

 

# timeout 이 발생했을때 connection 관리

RequestConnectionTimeout

connection pool 에서 connection 을 가져오기 위해 대기하다가 발생하는 예외이기 때문에 해당 예외가 발생한다고해서 pool 안에 있던 connection 이 영향받지 않는다. connection 을 대기하던 스레드만 ConnectionRequestTimeoutException 예외를 일으키게 된다.

 

ResponseTimeout

connection 을 생성하고, 응답의 첫번째 바이트를 대기하다가 시간초과가 발생했을때 SocketTimeoutException 을 일으킨다.

이때 해당 connection 은 폐기되어 재사용되지 않는다.

 

ConnectTimeout

connection 생성을 시도하다가 시간초과시 ConnectTimeoutException 을 일으킨다.

connection pool 이란 생성된 connection 을 관리하는 곳이기 때문에 지금처럼 애초에 생성되지 못했을땐 기존 connection pool 에 영향을 주지는 않는다.

 

SocketTimeout

응답 바이트를 받다가 설정한 시간을 초과하면 SocketTimeoutException 을 일으킨다.

이때 사용했던 connection 은 폐기되어 재사용되지 않는다.

 

# 발생할 수 있는 상황

ResponseTimeout 과 SocketTimeout 의 관계

ResponseTimeout 은 첫번째 응답 바이트가 오기까지 시간을 설정하는 것이고, SocketTimeout 은 첫번째 바이트를 받은 후의 시간을 설정하는 것이다. ResponseTimeout 200ms, SocketTimeout 100ms 로 설정되어 있다면 첫번째 바이트는 150ms 에 오고 두번째 바이트부터 50ms 마다 오게되면 해당 http 호출은 예외없이 진행된다.

 

ResponseTimeout 과 SocketTimeout 은 모두 전체 응답시간을 보장하지 않는다

계속 얘기하지만 ResponseTimeout 은 첫번째 바이트의 도착시간, SocketTimeout 은 두번째 이후 바이트의 도착시간이다. 그 어떤 것도 전체 바이트의 도착을 관장하지 않는다. 위와 동일하게 ResponseTimeout 200ms, SocketTimeout 100ms 로 설정되어 있다고 가정하고 첫번째 바이트가 150ms, 두번째 이후 바이트가 50ms 마다 오게되는 상황에서 전체 바이트가 모두 도착하는데 5000ms 가 걸린다면 해당 요청은 아무런 예외없이 5000ms 가 정상적으로 동작하게 된다. 때문에 네트워크 상황에 따라 timeout 설정에 비해 전체 응답이 오기까지 더 긴 시간이 소요될 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함