
Go 1.27의 net/http.Transport는 읽지 않은 HTTP/1 응답 본문을 닫을 때 최대 50ms 또는 256KB까지 비동기로 읽어 연결 재사용을 돕는다. 응답 본문을 다 읽지 않고 상태 코드만 확인하는 Go 프로그램에서 새 연결을 반복해 만드는 일을 줄일 수 있다.
Go 블로그의 벤치마크에서는 GODEBUG=http2client=0으로 HTTP/1을 사용해 index.golang.org에 100번 요청했을 때, 같은 프로그램이 Go 1.26에서 약 710ms, Go 1.27에서 약 150ms 걸렸다. 블로그는 이 차이가 해당 환경에서 거의 5배라고 설명한다.
HTTP/1에서는 응답이 한 연결의 바이트 스트림에 순서대로 도착한다. 다음 응답을 찾으려면 현재 응답 본문을 끝까지 읽어야 하므로, Go 1.26까지는 본문을 읽지 않은 채 resp.Body.Close()를 호출하면 연결을 재사용하지 못하고 다음 요청에 새 연결을 만들 수 있었다. HTTP/2는 한 연결에서 여러 스트림을 다중화하므로 이 문제가 발생하지 않는다.
Go 1.27부터는 사용자가 본문을 더는 필요로 하지 않을 때 닫기만 하면 된다. 전송 계층이 읽지 않은 HTTP/1 본문을 비동기로 처리하며, 응답에 Connection: close 헤더가 있으면 읽어도 연결 재사용에 도움이 되지 않으므로 건너뛴다. 블로그는 이 동작이 이후 Go 버전에서 바뀔 수 있다고 덧붙였다.
본문을 직접 비우는 기존 우회법은 큰 응답이나 느리게 도착하는 응답에서 데이터 처리량과 대기 시간을 제한해야 해 복잡해질 수 있었다. 특히 JSON 디코더는 객체 끝의 개행 문자를 남길 수 있어 본문이 거의 다 읽혔어도 연결을 재사용하지 못할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요