일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 무한페이징
- binary search
- NCP
- 13975
- 11501
- Java
- dto projection
- DP
- Blue/Green
- 모니터링
- 1495
- 백준
- 20115
- 12738
- Promtail
- 이분 탐색
- 2512
- greedy
- 그리디
- 로그
- 14921
- Lower bound
- 이진 탐색
- EntityGraph
- join제거
- no offset
- Upper bound
- 19598
- 3187
- slice개념
- Today
- Total
멘지의 기록장
로그에서 발견한 Time out 문제 해결하기 본문
프로젝트를 진행하며 모니터링 서버를 확인하던 중 어떠한 문제를 발견하였습니다.
그래서 이번에는 로그 데이터를 기반으로 프로젝트에 발생한 문제를 해결해보도록 하겠습니다.
로그 확인
[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이 제공하는 Retryer는 IOException이 발생한 경우에만 처리가 되고,
장애가 발생하였지만 복구된 상황에서, 재시도가 적용되어 동시 요청을 보낼 경우 다시 장애가 발생할 수 있기 때문에
조심하여 사용해야 합니다.
모니터링 서버의 로그 데이터에서 발견한 에러를 해결해보았습니다.
개발할 당시에는 문제가 발생하지 않아 확인하지 못했지만,
로그 데이터를 수집하고 관리를 통해 에러를 확인하고 이를 해결함으로써
⚡ 로그 데이터 관리의 중요성을 알 수 있었고, 안정적인 서비스를 제공할 수 있었습니다.
'SpringBoot' 카테고리의 다른 글
yml 파일을 서브 모듈로 관리하기 (0) | 2025.03.21 |
---|---|
JOIN 제거, Covering Index 적용, DTO projection을 사용해 성능 최적화 하기 (0) | 2025.02.18 |
Loki와 Promtail을 사용해 로그 모니터링 환경 구축하기 (0) | 2025.01.27 |
Logback 사용하여 로그 관리하기 (0) | 2025.01.25 |
Prometheus, Grafana 를 이용해 모니터링 환경 구축하기 (0) | 2025.01.24 |