서버에서 응답이 오지 않습니다.
[24.08.26 추가 내용] 동일한 오류가 Netflix 에서도 발생했었네요. 좀 더 상세하게 원인 분석이 되어 있습니다.
Netflix 엔지니어는 SpringBoot 3 및 임베디드 Tomcat이 있는 Java 21에서 실행되는 서비스에서 간헐적인 시간 초과 및 응답하지 않는 인스턴스를 관찰했습니다. JVM 인스턴스가 활성 상태를 유지했음에도 불구하고 트래픽을 제공하는 것을 중단했으며, 이는 상태에 갇힌 소켓이 상당히 증가한 것이 특징이었습니다. 이 상태는 원격 측의 TCP 연결을 닫았지만 로컬 측이 아직 끝을 닫지 않아 소켓이 대기 상태로 발생합니다. 이에 대한 자세한 내용은 RFC 793
closeWait
의 용어 섹션 에서 확인할 수 있습니다.
현재는 해결 방법이 없고, JDK 23이상 업데이트를 기다려야 합니다.
나의 경험
잘 돌아가던 spring boot 3 안의 톰켓에서 갑자기 응답이 없어졌습니다.
원인으로 여러가지를 테스트 해봤는데 결국 찾은 원인은
spring:
threads:
virtual:
enabled: true # virtual thread 활성화
위의 옵션이었습니다.
구성 환경 상세
인프라 내부 구성은 AWS EKS 기반의 조금 복잡한 구성을 갖습니다.
sequenceDiagram; NLB->>+ALB: 요청; ALB->>+WAS: 요청; WAS-->>-ALB: 응답; ALB-->>-NLB: 응답; box EKS; participant ALB; participant WAS; end;
kotlin 1.9.23
를 기반으로 spring boot 3.2.2
과 함께 사용하고 있으며, 로컬에서는 재현되지 않습니다.
로컬이나 개발 환경에서는 문제가 없었지만, 이상하게 특정 환경에서 connection이 끊기지 않고, CLOSE_WAIT
로 남아 서버로 요청의 응답이 오지 않았습니다.
내부 구성 때문에 발생한 건지 virtual thread 와 어느 부분의 충돌인지는 찾지 못했지만 해당 옵션을 제거하고 문제가 재발하지 않았습니다.
신기술을 사용할때는 꼭 많이 테스트 해봐야겠습니다.