플랫폼 운영중에 발생한 일이다. 플랫폼내의 특정 사업자가 투자를 많이 받았는지 갑자기 차량을 많이 구매해서 등록했는데 그 뒤로 지도에서 차량이 안보이다는 연락을 받았었다. 기능도 이상없고 로그도 이상없는데 뭐가 문제일까 하다가 프론트엔드 개발자에게 물어보니 지도 표시할때 전체 차량 목록을 다 요청한다는 것이였다. 호출하는 url을 달라고 했더니 화면 가득하고도 스크롤이 될만큼의 url을 전달받았다. 해당 사업자가 소유한 모든 차량 ID가 다 있었는데 전달받은 url 대로 호출해보니 413 에러를 내면서 구현된 로직까지도 호출되지 않는 상황이였다. 이러니 로그만 봐서는 찾지 못하는 것이였다.
처음에는 헤더 사이즈로 생각하고 늘리는 방법을 찾아 적용해 봤으나 해소되지 않았고 문서를 찾다가 netty javadoc사이트에서 HttpRequestDecoder의 생성자 내용을 찾고는 헤더 문제가 아닌것을 인지했다.
스프링에도 그 설정이 있는지를 확인했더니 아래 처럼 속성이 있어서 그것도 적용하였고
application.yml 에 적용하고
server:
netty:
max-initial-line-length: 80960
혹시나 싶어서 WebServerFactoryCustomizer 상속받은 컴포넌트에도 적용하여 해소하였다.
@Component
class WebConfiguration : WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {
@Value("\${server.netty.max-initial-line-length}")
private var maxInitialLingLength: Int = 0
override fun customize(serverFactory: NettyReactiveWebServerFactory) {
serverFactory.addServerCustomizers(NettyServerCustomizer { httpServer: HttpServer ->
httpServer.httpRequestDecoder { httpRequestDecoderSpec: HttpRequestDecoderSpec ->
httpRequestDecoderSpec
.maxInitialLineLength(maxInitialLingLength)
}
})
}
}
결론
급하게 장애 대응을 위해 위와 같이 조치를 했지만 결국 위의 서두에서 언급한것처럼 댓수가 더 늘어나는등의 이벤트로 인해 호출되는 url의 길이가 더 늘어난다면 다시 문제가 될 사항은 뻔한 일이다. 차라리 이런 경우에는 대상을 추릴수 있는 검색 조건등으로 결과를 내려줄수 있는방식이나 호출 대상의 제한을 두고 페이징 처리 하듯이 호출하게 하는것이 좋을것으로 생각한다.
'IT 기술 관련 > DevOps' 카테고리의 다른 글
자주 쓰는 도커 명령어 (0) | 2024.03.19 |
---|---|
[spring] 실시간 로그 레벨 조정 (0) | 2023.07.17 |
[spring] application.yml 설정 우선 순위(with config server) (0) | 2023.06.26 |
[spring] netty 기반 access log 기록 (0) | 2023.06.26 |
git 서브모듈(submodule) (0) | 2023.06.08 |