문서 메뉴
문서 홈
/ / /
C 드라이버
/ /

연결 풀링

이 페이지의 내용

  • 싱글 모드
  • 풀링 모드

MongoDB C 드라이버에는 단일 스레드와 풀의 두 가지 연결 모드가 있습니다. 단일 스레드 모드는 PHP와 같은 언어에 드라이버를 임베딩하는 데 최적화되어 있습니다. 멀티스레드 프로그램은 풀 모드를 사용해야 합니다. 이 모드는 총 연결 수를 최소화하고 풀링 모드에서는 백그라운드 스레드가 MongoDB 서버 토폴로지를 모니터링하므로 프로그램이 스캔을 차단할 필요가 없습니다.

단일 모드에서는 프로그램에서 mongoc_client_t 직접:

mongoc_client_t *client = mongoc_client_new (
"mongodb://hostA,hostB/?replicaSet=my_rs");

클라이언트는 프로그램이 MongoDB 작업에 처음 사용할 때 온디맨드 연결합니다. 서버당 비블로킹 소켓을 사용하여 각 서버에 대한 검사를 동시에 시작하고, 모든 서버가 응답하거나 시간 초과될 때까지 비동기 poll 또는 select 함수를 사용하여 소켓에서 이벤트를 수신합니다. 다시 말해, 단일 스레드 모드에서 C 드라이버는 모든 검사를 동시에 시작하기 위해 팬아웃한 다음 모든 검사가 완료되거나 시간 초과되면 팬인합니다. 스캔이 완료되면 클라이언트가 프로그램 작업을 실행하고 반환합니다.

단일 모드에서 클라이언트는 대략 분당 한 번씩 서버 토폴로지를 다시 스캔합니다. 이전 스캔 후 1분 이상 경과한 경우 클라이언트가 스캔을 완료하는 동안 클라이언트의 다음 작업이 차단됩니다. 이 간격은 heartbeatFrequencyMS 연결 문자열의 (으)로 구성할 수 있습니다. ( mongoc_uri_t.)

단일 클라이언트는 토폴로지의 서버당 하나의 연결을 엽니다. 이러한 연결은 토폴로지를 스캔하고 일반 작업을 수행하는 데 모두 사용됩니다.

풀링 모드를 활성화하려면 mongoc_client_pool_t를 생성하세요.

mongoc_uri_t *uri = mongoc_uri_new (
"mongodb://hostA,hostB/?replicaSet=my_rs");
mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);

프로그램이 처음 mongoc_client_pool_pop 을(를) 호출할 때 , 풀은 백그라운드에서 모니터링 스레드를 시작합니다. 모니터링 스레드는 연결 문자열의 모든 서버에 독립적으로 연결됩니다. 모니터링 스레드는 서버로부터 hello 응답을 받으면 서버 토폴로지의 공유 보기를 업데이트합니다. 새 서버가 검색되면 추가 모니터링 스레드와 연결이 생성됩니다. 서버 토폴로지의 공유 보기에서 서버가 제거되면 모니터링 스레드가 종료됩니다.

MongoDB 작업을 실행하는 각 스레드는 풀에서 클라이언트를 체크아웃해야 합니다.

mongoc_client_t *client = mongoc_client_pool_pop (pool);
/* use the client for operations ... */
mongoc_client_pool_push (pool, client);

mongoc_client_t 객체는 스레드로부터 안전하지 않으며,mongoc_client_pool_t 입니다.

드라이버가 풀 모드에 있으면 모니터링에서 사용 가능한 서버를 발견하는 즉시 프로그램 작업이 차단 해제됩니다. 예를 들어, 프로그램의 스레드가 프라이머리에서 "삽입"을 실행하기 위해 대기 중인 경우 모든 세컨더리도 검사할 때까지 기다리지 않고 프라이머리가 발견되는 즉시 차단이 해제됩니다.

풀은 모니터링을 위해 서버당 하나의 연결을 열고, 각 클라이언트는 애플리케이션 작업에 사용하는 각 서버에 대한 자체 연결을 엽니다. 백그라운드 모니터링 스레드는 10 약 초마다 서버를 독립적으로 다시 스캔합니다. 이 간격은 heartbeatFrequencyMS 연결 문자열의 (으)로 구성할 수 있습니다. ( mongoc_uri_t.)

연결 문자열은 를 지정하여 waitQueueTimeoutMS mongoc_client_pool_pop 이 풀에서 클라이언트를 기다립니다. (mongoc_uri_t.)waitQueueTimeoutMS 가 지정된 경우 클라이언트가 실제로 반환되었는지 확인해야 합니다.

mongoc_uri_t *uri = mongoc_uri_new (
"mongodb://hostA,hostB/?replicaSet=my_rs&waitQueueTimeoutMS=1000");
mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);
mongoc_client_t *client = mongoc_client_pool_pop (pool);
if (client) {
/* use the client for operations ... */
mongoc_client_pool_push (pool, client);
} else {
/* take appropriate action for a timeout */
}

연결 풀 옵션 보기 풀 크기와 동작을 구성하고 mongoc_client_pool_t 를 참조하세요. 풀링 모드에서 드라이버를 사용하는 멀티스레드 프로그램의 확장된 예제입니다.

돌아가기

고급 연결

다음

데이터 압축

이 페이지의 내용