문제
WebClient로 api 호출하는데 간헐적으로 "org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144"가 발생했다.
참고, webflux나 netty를 사용 중이면 아래 에러가 추가로 발생한다.
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
에러 로그
- Error was received while reading the incoming data. The connection will be closed. io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
- An exception has been observed post termination, use DEBUG level to see the full stack: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
원인
WebClient의 기본 버퍼 사이즈는 256K다. api 응답 값의 크기가 256K가 넘어서 발생한 에러다.
해결책
WebClient codec의 maxInMemorySize에 원하는 값을 설정해주면 해결된다.
제한을 두고 싶지 않은 경우 -1로 설정하면 된다.
터무니 없이 큰 값을 설정할 경우 timeout이나 서버 메모리 부족 문제가 발생할 수 있으니 신중하게 정해야 한다.
WebClient.builder()
.baseUrl("http://localhost:9000")
.codecs {
it.defaultCodecs().maxInMemorySize(1024 * 1024 * 10) // 1MB 제한
}
.build()
댓글