멘지의 기록장

로그에서 발견한 Time out 문제 해결하기 본문

SpringBoot

로그에서 발견한 Time out 문제 해결하기

멘지 2025. 1. 28. 22:01

프로젝트를 진행하며 모니터링 서버를 확인하던 중 어떠한 문제를 발견하였습니다.

그래서 이번에는 로그 데이터를 기반으로 프로젝트에 발생한 문제를 해결해보도록 하겠습니다.


로그 확인

[2024-12-18 07:04:00:216447866] [scheduling-1] ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler.handleError:95] - Unexpected error occurred in scheduled task feign.RetryableException: Read timed out executing GET [https://apihub.kma.go.kr/api/typ01/url/wrn_now_data.php?fe=f&tm=20241219 23%3A59&help=1&authKey=](https://apihub.kma.go.kr/api/typ01/url/wrn_now_data.php?fe=f&tm=20241219%2023%3A59&help=1&authKey=)
at feign.FeignException.errorExecuting(FeignException.java:278)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:110)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70)
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99)
at jdk.proxy2/jdk.proxy2.$Proxy230.getWeatherWarning(Unknown Source)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:278)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:304)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)

 

모니터링 서버에서 위와 같은 오류를 발견하였습니다.

 

오류를 확인해보니 RetryableException (Read timed out) 이라는 Exception으로

요청을 처리하는 동안 응답을 기다리다가 시간이 초과되었음을 나타내는 Exception 입니다.

즉, 서버가 응답하지 않아서 연결이 끊어진 것이었습니다.

 

OpenFeign이 기본적으로 설정되어 있는 timeout은 다음과 같습니다.

  • connectTimeout : 1000 (1초)
  • readTimeout : 60000 (60초)

connectTimeout서버에 연결을 시도하는 것에 대한 시간 제한을 의미하고,

readTimeout요청한 서버가 로직을 수행하는 것에 대한 시간 제한을 의미합니다.


Timeout 설정

이와 같은 문제를 해결하기 위해선 timeout 시간을 늘려주면 됩니다.

 

위의 오류는 서버에 연결을 시도했을 때 time out이 발생한 것이었기 때문에

connectTimeout을 60초로 늘리고, readTimeout은 그대로 60초로 작성하겠습니다.

 

아래의 내용을 application.yml에 작성하면 완성입니다.

feign:
  client:
    config:
      default:
        connectTimeout: 60000
        readTimeout: 60000

 

이를 적용하고 코드를 실행시켰을 때 값이 잘 나오고 ,

모니터링 로그에서도 Feign 관련한 응답값이 문제 없이 오는 것을 확인할 수 있었습니다.


재시도 설정

이외에도 재시도를 설정하여 문제를 해결할 수 있습니다.

 

Feign은 기본적으로 Retryer.NEVER_RETRY를 등록해 재시도를 시도하지 않기 때문에 

재시도를 설정하고 싶다면 따로 설정을 추가해주어야 합니다.

 

아래와 같이 작성하면 재시도 설정이 완료됩니다.

@Configuration
@EnableFeignClients("com.package.openfeign")
class OpenFeignConfig {

    @Bean
    Retryer.Default retryer() {
        // 0.1초의 간격으로 시작해 최대 3초의 간격으로 점점 증가하며, 최대 5번 재시도한다.
        return new Retryer.Default(100L, TimeUnit.SECONDS.toMillis(3L), 5);
    }
}

 

🚨 하지만, Feign이 제공하는 RetryerIOException이 발생한 경우에만 처리가 되고,

장애가 발생하였지만 복구된 상황에서, 재시도가 적용되어 동시 요청을 보낼 경우 다시 장애가 발생할 수 있기 때문에

조심하여 사용해야 합니다.


 

모니터링 서버의 로그 데이터에서 발견한 에러를 해결해보았습니다.

 

개발할 당시에는 문제가 발생하지 않아 확인하지 못했지만,

로그 데이터를 수집하고 관리를 통해 에러를 확인하고 이를 해결함으로써

로그 데이터 관리의 중요성을 알 수 있었고, 안정적인 서비스를 제공할 수 있었습니다.