본문 바로가기

소프트웨어-이야기/인프라

HTTP KeepAlive와 Spring Tomcat과 Netty ConnectionPool의 관계

persistent connection이란?

클라이언트에서 매번 커넥션을 새로 맺는 비용을 줄이기 위해, 커넥션을 일정기간 유지하는 것을 말한다. 

 

KeepAlive이란?

persistent connection을 맺는 방법 중 하나이다.

HTTP 1.0부터 지원하기 시작했다. HTTP 1.0에서는 기본값은 비활성화이다.

HTTP 1.1부터는 KeepAlive가 기본 설정이다.

 

서버의 커넥션 최대 유휴 시간

클라이언트에서 커넥션을 맺어두기만 해놓고, 사용하지는 않는다면 서버 입장에서는 불필요한 리소스를 낭비하게 된다.

그래서 서버 애플리케이션에서는 서버 최대 유휴 시간을 설정할 수 있다.

즉, 커넥션을 맺은 이후 특정 기간동안 사용되지 않았다면, 커넥션을 강제로 끊어버리는 행위를 말한다.

 

Spring > Tomcat의 설정

server:
  port: 8000
  tomcat:
    connection-timeout: 30s

application.yaml 파일을 통해, tomcat 서버의 유휴 커넥션 타임아웃 시간을 설정할 수 있다. 

 

클라이언트와 서버 간의 유휴 커넥션 타임아웃 시간 조정하기

커넥션을 사용하지 않는 다면, 서버 애플리케이션이 유휴 커넥션 타임아웃이 지났다고 판단하여 커넥션을 끊게 된다.

이 경우, 클라이언트에서 커넥션이 끊어졌다는 사실을 인지하지 못할 수 있다.

그래서 이미 만료된 커넥션을 재사용하여, 오류가 발생할 수 있다.

그래서 클라이언트는 커넥션을 재사용하는 기간을 타겟 서버의 유휴 커넥션 타임아웃 시간보다 적게 설정하는 것이 좋다.

 

Reactor Netty Connection Pool 설정

ConnectionProvider provider =
        ConnectionProvider.builder("custom")
                          .maxIdleTime(Duration.ofSeconds(20))           
                          .build();

HttpClient client = HttpClient.create(provider);

 

클라이언트 서버의 Connection Pool에서 서버의 커넥션 최대 유휴시간보다 maxIdleTime을 작게 설정하여,

이미 종료된 커넥션을 재사용하는 문제를 방지할 수 있다. 

 

https://etloveguitar.tistory.com/137

https://projectreactor.io/docs/netty/release/reference/index.html#faq.connection-closed

https://projectreactor.io/docs/netty/release/reference/index.html#_connection_pool_2