ConnectionPool 이란?
연결을 재사용 가능한 형태로 미리 생성해두고, 필요할 때 애플리케이션에서 제공하는 매커니즘입니다.
ConnectionPool을 사용하는 주요 이유는 연결을 맺고 해제하는 과정이 상대적으로 많은 자원과 시간을 소모하기 때문입니다.
Connection Pool 동작 과정
- 애플리케이션이 시작될 때, Connection Pool은 지정된 수의 연결을 미리 생성합니다.
- 애플리케이션은 연결 작업이 필요할 때, Connection Pool로부터 연결을 요청합니다.
- Connection Pool은 사용 가능한 연결을 애플리케이션에 제공합니다.
- 애플리케이션은 작업이 끝나면 연결을 닫지 않고, 다시 Connection Pool에 반환합니다. 이 연결은 후속 요청에서 재사용됩니다.
Connection Pool의 장단점
장점
- 응답 시간 감소
사용자가 웹 애플리케이션에 로그인 요청을 보낼 때마다 새로운 연결을 생성하는 대신, 미리 생선된 연결을 사용하여 즉시 응답을 처리할 수 있습니다.
연결 설정 시간이 제거되므로 전체 응답 시간이 빨라집니다.
- 리소스 최적화
연결 풀을 사용하면 동시에 열려있는 연결 수를 제한할 수 있습니다.
이렇게 하면 서버에 과도한 부하가 걸리는 것을 방지하면서 리소스를 효율적으로 활용할 수 있습니다.
- 시스템 안정성 향상
특정 서비스에 대한 급증한 요청으로 서비스가 다운되는 경우, 연결 풀의 크기 제한을 사용하여 특정 임계값을 넘지 않게 할 수 있습니다.
이는 서비스 거부 공격(Denial-of-Service attack)과 같은 상황에서도 서비스의 안정성을 유지하는데 도움이 됩니다.
단점
- 초기 구성 복잡성
연결 풀의 최소/최대 크기, 유휴 시간, 연결 유효성 검사 등 다양한 설정 값을 조절하고 최적화해야 합니다.
설정이 적절하지 않으면 성능 문제나 안정성 문제가 발생할 수 있습니다.
- 잠재적 리소스 낭비
연결 풀의 크기가 너무 크게 설정되면, 실제로 사용되지 않는 많은 연결이 유휴 상태로 남아 있게 되어 리소스가 낭비될 수 있습니다.
- 커넥션 누수 위험
애플리케이션 코드에서 연결을 올바르게 반환하지 않으면, 해당 연결이 풀에서 계속 점유되게 됩니다.
이러한 상황이 반복되면 결국 풀에 사용 가능한 연결이 없게 되어 새로운 요청을 처리할 수 없게 됩니다.
이를 커넥션 누수(connection leak)라고 합니다.
- 불완전한 연결 상태
연결이 오래동안 유휴 상태로 있거나 네트워크 문제 등으로 인해 연결이 끊어진 상태일 수 있습니다.
이 경우, 애플리케이션이 해당 연결을 사용하려고 하면 오류가 발생할 수 있습니다.
이를 방지하기 위해 연결 유효성 검사 등의 추가 작업이 필요합니다.
Connection Pool 이 주로 사용되는 4가지
- DB
- DB 연결은 생성과 해제에 비용이 많이 들기 때문에, 연결 풀링을 통해 성능을 향상시킬 수 있습니다.
- HTTP 연결
- 웹 서버 또는 웹 서비스에 대한 HTTP(S) 연결을 풀링하여, 동일한 목적지에 대한 반복적인 요청의 성능을 향상시킬 수 있습니다.
- 네트워크 소켓 연결
- 원격 서비스나 미들웨어(ex: message broker) 와의 통신을 위한 일반적인 TCP 또는 UDP 소켓 연결을 풀링할 수 있습니다.
- LDAP 연결
- LDAP 서버와의 통신을 위한 연결을 풀링하여, 사용자 인증 및 권한 부여 쿼리의 성능을 향상시킬 수 있습니다.
Connection Pool 의 주요 설정 값
- maxPoolSize (최대 풀 크기)
- 연결 풀에 보유할 수 있는 최대 연결 수 입니다.
- 너무 큰 값은 시스템의 자원을 낭비할 수 있으므로, 실제 시스템의 부하에 따라 조절이 필요합니다.
- minPoolSize (최소 풀 크기)
- 연결 풀이 유지해야 하는 최소한의 연결 수 입니다.
- 시스템이 비활성 상태일 때도 일정 수의 연결을 유지하게 됩니다.
- initialPoolSize (초기 풀 크기)
- 연결 풀이 처음 생성될 때 만들어져야 하는 연결의 수 입니다.
- minPoolSize 이상, maxPoolSize 이하의 값이 되어야 합니다.
- connectionTimeout (연결 시간 초과)
- 연결을 얻기 위해 대기할 최대 시간입니다.
- 지정된 시간 안에 연결을 얻지 못하면 오류가 발생합니다.
- idleTimeout (유휴 연결 시간 초과)
- 연결이 유휴 상태로 있을 수 있는 최대 시간입니다. 이 시간을 초과하면 연결은 닫힙니다.
- 유휴 상태(Idle State)는 어떤 자원이 활성화되어 있찌만 현재 사용되고 있지 않은 상태(대기 중, 사용되지 않는 상태) 입니다.
- maxLifetime (최대 연결 수명)
- Pool 에 있을 수 있는 연결의 최대 수명입니다.
- 이 시간을 초과하면 연결은 닫힙니다.
- validationTimeout (검증 시간 초과)
- 연결 검증에 대한 최대 대기 시간입니다.
- connectionTestQuery (연결 테스트 쿼리)
- 연결의 유효성을 확인하기 위한 쿼리입니다.
- 일반적으로 간단한 쿼리 (ex: 'SELECT 1')가 사용됩니다.
ConnectionPool 의 적절한 설정값 구하기
사실상 ConnectionPool 의 설정값을 "이 값으로 하면 최적이다"라고 하는 값은 없습니다.
그러므로 다음과 같은 절차를 따라 적절한 설정값을 구할 수 있습니다.
- 시스템 분석
- 시스템의 특성, 예상 사용자 수, 트래픽 패턴, 데이터베이스와의 통신 패턴 등을 분석합니다.
- 기본값 시작
- 많은 Connection Pool 라이브러리는 합리적인 기본값을 제공합니다. 이를 시작점으로 사용하고, 이후에 조절할 수 있습니다.
- 모니터링
- 초기 설정을 한 후에는 Connection Pool 의 사용 상태를 모니터링 합니다.
- 풀에서 사용 가능한 연결의 수, 대기 중인 연결 요청의 수, 유휴 연결의 수 등을 확인할 수 있습니다.
- 부하 테스트
- 시스템에 예상 트래픽 이상의 부하를 가하면서 Connection Pool의 동작을 관찰합니다.
- 이를 통해 최대 연결 수, 연결 시간 초과 등의 설정값을 조절할 수 있습니다.
- 조절 및 반복
- 모니터링 및 부하 테스트의 결과를 바탕으로 설정값을 조절하고, 다시 테스트와 모니터링을 반복합니다.
- 유휴 연결 관리
- 연결이 유휴 상태로 오래 유지되지 않도록 설정합니다.
- 일정 시간 이상 사용되지 않는 연결은 자동으로 닫히도록 'idleTimeout' 설정을 조절할 수 있습니다.
- 문서화
- 설정값과 그 이유, 테스트 결과 등을 문서화하여 나중에 참조하거나, 다른 팀원과 공유할 수 있도록 합니다.
- 정기적인 리뷰
- 시스템의 환경이나 요구 사항이 변경될 수 있으므로, 주기적으로 Connection Pool 설정을 리뷰하고 필요에 따라 조절합니다.
'개발 > MSA' 카테고리의 다른 글
프로토콜 버퍼(Protocol Buffers, Protobuf)란? (0) | 2023.09.19 |
---|