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를 참조하세요.