Programming Language/Java

[Java/Error] Broken Pipe 파이프가 깨어짐

Ma_Sand 2023. 6. 23. 16:02
반응형

java.io.IOException: Broken pipe

 

해당 오류는 크게 세 가지 원인으로 발생한다.

 

1. Receiver에서 송신받은 데이터를 제때 처리하지 못하는데도 Sender가 계속 데이터를 보내는 경우에 발생한다.

    예를 들어 네트워크 속도가 느리다거나 CPU가 MAX 상태인 경우가 이에 해당된다.

 

2. 두 개의 소켓이 통신하다가 소켓을 담당하던 프로세서가 비정상적으로 종료된 경우, 상대 소켓이 이를 알지 못하고 데이터를 전송할 때 발생한다.

 

3. 클라이언트의 요청 이후 서버에서 작업을 완료하여 클라이언트로 결과를 전달해주기 전에 

 1) 네트워크가 끊기거나

 2) 클라이언트가 정지버튼을 누르거나

 3) 브라우저가 종료되거나

 4) 다른 화면으로 이동하여서

위와 같은 최초 요청에 대한 정보가 사라지는 경우, 서버 측에서 작업 결과를 전달할 클라이언트가 없어 발생한다.

 

 

반응형

 

이를 해결하는 방법은 5가지가 있다.

 

1. 요청(Request) 이후에 응답(Response)를 기다린다.

 클라이언트는 데이터를 계속해서 보내지 않고 하나의 레코드를 보낸 뒤 서버에서 정상적으로 수신되었다는 응답을 받게끔 한다. 이 경우 요청과 응답의 과정 속도가 느려진다.

 

2. Exception을 무시한다.

 클라이언트가 비정상적인 종료를 했을 때 Broken Pipe 신호가 발생하고 서버에서 클라이언트의 종료를 제어할 수 없으므로 신호를 무시한다.

 

3. 중복 요청을 막는다.

 클라이언트에서 연속적인 클릭을 방지하거나 Exception 처리 부분에서 오류를 던지지 않도록 한다.

 

4. Timeout 값을 늘린다.

 

5. 가용 스레드를 늘린다.

 

그런데 4, 5번은 조직 내 정책 및 인프라 조건에 영향을 받기 때문에 1~3번으로 해결하는 것이 좋다.

이때, 2번의 경우 Exception을 무시하는 것이 좋은 방법은 아닐 수 있으나 어떠한 경우에 있어서는 반대일 수 있다.

예를 들어 의도적으로 많은 요청을 받도록 하고 이에 대해 클라이언트가 해결방법을 결정하는 경우가 있다. 클라이언트가 일부러 특정 요청을 보내고 이에 대한 대비책을 클라이언트게 준비했다면 Exception을 무시하는 것이 최선일 수 있다.

 

 

 

반응형