개요
이 가이드 에서는 Node.js 운전자 연결 풀을 사용하여 MongoDB deployment 에 대한 연결을 관리 방법과 애플리케이션 에서 연결 풀 설정을 구성하는 방법에 대해 학습 합니다.
연결 풀 Node.js 운전자 에 의해 유지 관리되는 개방형 데이터베이스 연결의 캐시 입니다. 애플리케이션 MongoDB 에 대한 연결을 요청하면 Node.js 운전자 풀에서 원활하게 연결을 가져오고, 작업을 수행하고, 재사용을 위해 풀에 연결을 반환합니다.
연결 풀은 애플리케이션 지연 시간 줄이고 Node.js 운전자 에서 새 연결을 생성하는 횟수를 줄이는 데 도움이 됩니다.
연결 풀 구성
모든 MongoClient
인스턴스 에는 MongoDB 토폴로지 의 각 서버 에 대한 내장 연결 풀 있습니다. minPoolSize
옵션을 구성하지 않으면 연결 풀이 필요에 따라 소켓을 열어 애플리케이션 에서 MongoDB 에 대한 동시 요청을 지원 .
MongoClient
인스턴스 에서 다음 연결 풀 설정을 지정할 수 있습니다.
설정 | 설명 |
---|---|
| The maximum number of concurrent connections that the pool maintains.
If the number of in-use connections to a server reaches the specified
value, the next request to that server waits until a connection becomes
available. Default: 100 |
| The maximum number of connections that each pool can establish
concurrently. |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of milliseconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
| The maximum number of milliseconds that a request can wait for a socket
to become available. Default: 0 (no limit) |
maxPoolSize
애플리케이션의 요청을 지원 데 필요한 소켓 외에도 각 MongoClient
인스턴스 서버 상태 모니터링 위해 MongoDB 토폴로지 에서 서버 당 최대 두 개의 연결을 엽니다.
예시 들어, 3노드 복제본 세트 에 연결된 클라이언트 6개의 모니터링 소켓을 엽니다. 애플리케이션 maxPoolSize
기본값 설정을 사용하고 프라이머리 (기본값) 노드 만 쿼리하는 경우 연결 풀 에는 최대 106
개의 열린 소켓과 100
개의 연결이 있을 수 있습니다. 애플리케이션 읽기 설정 (read preference) 사용하여 세컨더리 노드를 쿼리 경우 이러한 연결 풀이 커지고 개방형 모니터링 소켓을 포함하여 총 연결 수가 306
개가 될 수 있습니다.
하나의 프로세스 내에서 많은 수의 동시 MongoDB 요청을 지원하려면 maxPoolSize
를 늘리면 됩니다.
다음 코드는 options
객체 에 maxPoolSize
옵션을 지정하여 최대 연결 풀 크기가 200
인 MongoClient
인스턴스 를 생성합니다.
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxPoolSize: 200 });
maxConnecting
연결 풀 속도 제한 연결 설정. maxConnecting
옵션은 풀이 언제든지 병렬로 생성할 수 있는 연결 수를 결정합니다. 예시 를 들어 maxConnecting
값이 2
인 경우 연결을 동시에 체크아웃하려는 세 번째 요청 다음 경우 중 하나가 발생할 때만 성공합니다.
연결 풀에서 연결 생성이 완료되었으며 풀에 연결 수가
maxPoolSize
미만입니다.기존 연결이 풀로 다시 확인됩니다.
다음 코드는 options
객체 에 maxConnecting
옵션을 지정하여 풀당 동시에 설정할 수 있는 최대 2
연결을 가진 MongoClient
인스턴스 만듭니다.
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxConnecting: 2 });
minPoolSize
minPoolSize
옵션을 사용하여 각 서버 에 대한 최소 연결 수를 설정하다 수 있습니다. 운전자 연결 풀 에 minPoolSize
옵션으로 설정하다 연결 수가 항상 최소한 있는지 확인합니다. 소켓이 닫혀 총 소켓 수(사용 중인 소켓과 유휴 상태 모두)가 최소값 아래로 떨어지면 최소값에 도달할 때까지 더 많은 소켓이 열립니다.
다음 코드는 options
객체 에 minPoolSize
옵션을 지정하여 최소 연결 풀 크기가 10
인 MongoClient
인스턴스 생성합니다.
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { minPoolSize: 10 });
참고
maxIdleTimeMS
로 구성된 MongoClient
및 0
로 설정하다 minPoolSize
는 활동량이 지속적으로 낮은 워크로드에 최적입니다. 이 구성을 사용하면 연결 풀 비활성 기간 동안 사용하지 않는 연결을 닫을 수 있습니다.
6.18.0 이전 버전에서는 비활성 기간 동안 minPoolSize
이(가) 0
(으)로 설정하다 되었을 때 Node.js 운전자 유휴 연결을 닫지 않았습니다. 버전 6.18.0부터 연결 풀 minPoolSize
설정에 관계없이 유휴 연결을 올바르게 닫습니다.
maxIdleTimeMS
maxIdleTimeMS
옵션을 설정하여 연결이 풀에서 유휴 상태로 유지될 수 있는 최대 시간(밀리초)을 설정할 수 있습니다. 연결이 maxIdleTimeMS
동안 유휴 상태이면 연결 풀이 이를 제거하고 교체합니다. 이 옵션의 기본값은 0
(제한 없음)입니다.
다음 코드는 options
객체 에 maxIdleTimeMS
설정을 지정하여 최대 유휴 시간이 10000
밀리초(10 초)인 MongoClient
인스턴스 생성합니다.
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxIdleTimeMS: 10000 });
waitQueueTimeoutMS
MongoClient
여러 개의 동시 요청을 지원합니다. 각 프로세스에 대해 클라이언트를 만들어 프로세스의 모든 작업에 재사용합니다. 이 방법은 각 요청에 대해 클라이언트를 만드는 것보다 더 효율적입니다.
드라이버는 소켓이 사용 가능해질 때까지 기다릴 수 있는 요청 수를 제한하지 않으며, 부하 급증 시 해당 풀의 크기를 대기 중인 제한으로 제한하는 것은 애플리케이션의 책임입니다. 요청은 waitQueueTimeoutMS
옵션에 지정된 시간 동안 대기하며 기본값은 0
(제한 없음)입니다.
소켓에 대해 waitQueueTimeoutMS
에 정의된 시간보다 오래 기다리는 요청은 연결 오류를 발생시킵니다. 모든 작업을 완료하는 것보다 부하가 급증하는 동안 작업 기간을 제한하는 것이 더 중요한 경우 이 옵션을 사용합니다.
다음 코드는 options
객체 에서 선언하여 최대 대기열 시간 제한이 10000
밀리초(10 초)인 MongoClient
인스턴스 생성합니다.
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { waitQueueTimeoutMS: 10000 });
연결 닫기
요청 이 MongoClient.close()
을(를) 호출하면 Node.js 운전자 다음 조치를 수행합니다.
연결 풀 의 모든 유휴 소켓을 닫습니다.
풀로 반환될 때 사용 중인 모든 소켓을 닫습니다.
관련 작업이 완료될 때만 사용 중인 모든 소켓을 닫습니다.
MongoClient.close()
를 호출하면 비활성 소켓만 닫히고 진행 중인 작업이 직접 종료되지 않습니다.
참고
MongoClient.close()
메서드는 기존 세션과 트랜잭션을 닫으며, 이는 진행 중인 작업의 동작에 간접적으로 영향을 미치고 커서를 엽니다.
소켓 시간 초과 방지
연결 풀 크다고 해서 항상 재연결 요청이 줄어드는 것은 아닙니다. 다음 예시 시나리오를 가정해 보겠습니다.
애플리케이션 의 연결 풀 크기가 5 소켓이고
socketTimeoutMS
옵션이 5000 밀리초로 설정하다 있습니다.작업은 평균 3000 밀리초마다 발생하며 재연결 요청이 자주 발생합니다.
각 소켓은 5000 밀리초 후에 시간 초과되므로 모든 소켓이 닫히지 않으려면 이 5000 밀리초 동안 조치를 취해야 합니다.
이 시나리오에서 각 소켓은 5000 밀리초 후에 시간 초과되며, 소켓이 닫히지 않으려면 이 시간 초과 기간 내에 활동해야 합니다. 그러나 3000 밀리초마다 하나의 메시지로는 모든 소켓을 활성 상태로 유지하기에 충분하지 않아 여러 소켓의 시간 초과가 발생합니다.
과도한 소켓 시간 초과를 방지하려면 maxPoolSize
옵션을 지정하여 운전자 연결 풀 에서 유지할 수 있는 연결 수를 줄입니다. maxPoolSize
옵션을 설정하다 방법을 학습하려면 maxPoolSize 섹션을 참조하세요.
API 문서
Node.js 운전자 사용하여 MongoClient
객체 만들고 옵션을 지정하는 방법에 대한 자세한 내용은 다음 API 설명서를 참조하세요.