지나공 : 지식을 나누는 공간

Response already committed. broken pipe. 본문

Tech

Response already committed. broken pipe.

해리리_ 2024. 5. 26. 19:07

Response already committed / broken pipe

 

위 상황이 발생하는 통신 과정에 대해 알아보자.

 

  1. 클라이언트가 서버에 요청
  2. 서버는 클라이언트의 요청을 수신해서 필요한 작업을 수행
  3. 응답 준비
    • HTTP 메시지 형태의 응답을 구성하여 준비한다. header, body 로 이루어진다.
  4. 응답 전송:
    • 서버는 준비한 응답을 클라이언트에게 전송하는데, 이때 header가 먼저 전송되고 body가 뒤따라 전송된다.
    • 응답 header를 클라이언트에 전송하고 나서 응답 body를 보내려는 시점을 commit 이라고 한다. 이 시점부터는 header를 변경하거나 새로운 응답을 보내는 것이 불가능하다.
  5. 데이터 전송 중 클라이언트에서 연결 종료
    • 클라이언트가 응답을 받는 도중에 연결을 종료할 수도 있다. 사용자가 중간에 브라우저를 닫거나, 다운로드 중이던 파일의 다운로드를 취소하거나, 처리 중인 요청을 사용자가 기다리지 않고 새로고침을 여러번 실행하는 사례가 있다.
  6. Broken Pipe 오류 발생
    • 클라이언트가 연결을 종류한 후인데도 서버가 데이터 전송을 시도하면 broken pipe가 발생한다. 서버가 데이터를 더이상 전송할 수 없음을 의미한다.

일반적으로 서버에는 응답을 쓰기 위한 고정 크기(일반적으로 2KB - 10KB) 버퍼가 있다. 서버가 응답 데이터를 버퍼에 채우고, 버퍼가 가득 차면 이걸 클라이언트로 전송(flush)한다. 즉, 응답 데이터가 커서 버퍼 크기를 초과하면 버퍼가 여러번 flush 되면서 데이터가 부분적으로 클라이언트에 전송된다. 이건 근데 응답이 클 때 얘기고... 응답이 크지 않더라도 요청 당시의 정보가 사라지면 서버 측에서는 작업의 결과를 전달할 곳이 없어지면서 Broken Pipe가 발생하는 것이다.

 

위 문제를 해결하는 방법 중 하나는 서버가 보내는 응답 중 가장 큰 크기만큼 버퍼의 크기를 크게 구성하는 것이 있다. tomcat에서 bufferSize 속성으로 이걸 조절할 수는 있지만 이 설정을 통해 응답 출력 스트림에서의 flush호출을 막을 수 있는 건 아니다. 아니면 이 exception을 그냥 무시하기도 한다. 클라이언트가 요청을 닫은 것을 서버 측에서 어찌할 수 없기도 하고, 서비스 영향도 안 받기 때문이다. 아니면 여러번 중복 요청 되는 것을 막기 위해 짧은 시간 여러번 버튼 클릭되는 경우를 제어하는 것도 방법이라고 한다..

 

아무튼 정리하면 already committed는 이미 commit된 응답인데 이걸 또 요청할 때 발생하고, broken pipe는 최초 요청했던 곳으로 응답하고 싶은데 그곳이 사라지니 발생한다. 

 

 

---

 

 

 

그런데 여기서 의문은 왜 두 에러가 같이 발생하는지였다. 그걸 찾아보니 아래처럼 나왔다.ㅎㅎ...

 

서버가 클라어인트로 일부 데이터를 전송해서 커밋까지 이뤄진 시점인데 여기서 사용자가 브라우저를 닫으면 Broken Pipe 가 발생한다. 이렇게 예외가 발생한 경우에 예외처리 과정에서 서버가 응답을 변경하거나 새로운 응답을 생성해서 클라이언트로 보낼 수도 있는데, 이때 커밋을 또 시도하게 되니까 response already committed가 발생한다고 한다. 서버에서 응답을 동적으로 조작하는 경우, 이렇게 broken pipe가 발생했을 때에 추가적으로 응답 변경을 시도할 수 있고, commit 이후에는 응답 변경이 안되니까 already commited가 발생한다. 

 

출처:

https://stackoverflow.com/questions/14392361/what-exactly-does-response-already-committed-mean-how-to-handle-exceptions-th

https://lookingfor.tistory.com/entry/%EC%9E%90%EB%B0%94-ExceptionBroken-pipe-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#google_vignette

728x90
Comments