-
ClientAbortException은 언제 발생하는가?실무에서 알게된 내용 2022. 6. 23. 08:05
서비스 모니터링을 하다가 아래처럼 ClientAbortException(java.io.IOExceiption: Broken pipe)이 발생하고 있는 것을 확인했다. 이에 해당 Exception이 언제 발생하는지를 분석해 봤다.
일단 해당 로그를 보면서 가장 눈에 띄었던 포인트는 특정 API를 호출하는데 4초가 걸리는 점과 예외 메시지에 org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe이 있다는 점이었다.
이를 근거로 클라이언트 쪽에서 API 응답 시간이 오래 걸리니까 서버에서 응답을 내려주기 전에 커넥션을 끊어 버려서 그런가?라는 의심을 했었다.
코드를 분석해보니 아래 빨간 네모 부분에서 Exception이 발생하고 있었고, 친절하게도 해당 부분에 주석이 적혀 있었는데 '쓰기에 대한 IO Exception은 거의 항상 요청을 중단하는 웹 클라이언트(브라우저 또는 REST 클라이언트) 때문'이라고 명시돼 있었다.
[org.apache.catalina.connector.OutputBuffer 클래스]
즉, 서버가 응답을 내려주기 전에 클라이언트에서 커넥션을 끊어버리는 경우(아래 참조) 이때 해당 예외가 발생한다.
클라이언트에서 아래 행동이 일어날 때
- 웹브라우저를 종료한 경우
- 웹 페이지를 새로고침 하거나 다른 곳으로 이동한 경우
- HTTP client 가 소켓 타임아웃으로 인해 커넥션을 끊어 버린 경우
아래는 로컬 환경에서 재현하여 확인한 에러 메시지 내용이다.
참고 자료
'실무에서 알게된 내용' 카테고리의 다른 글
모듈간 의존성 개선 및 정리 작업 (0) 2022.06.30 로그가 간헐적으로 중복 노출되는 이슈 (0) 2022.06.29 운영 배포 전에 챙겼던 Kafka Producer Client 포인트들 (0) 2022.06.22 컬럼 값을 Collection으로 받을 때 Querydsl 이슈 (0) 2022.06.21 Grafana loki에서 에러 로그 하나가 검색이 안 됐던 이슈 (0) 2022.06.14