Menu Docs
Página inicial do Docs
/ / /
Driver C
/ /

Pool de conexões

Nesta página

  • Modo Único
  • Modo Agrupado

O driver do MongoDB C tem dois modos de conexão: thread único e pool. O modo de thread único é otimizado para incorporar o driver em linguagens como PHP. Programas com várias threads devem usar o modo pool: esse modo minimiza a contagem total de conexões e, no modo pool, as threads em segundo plano monitoram a topologia do servidor MongoDB para que o programa não precise bloquear sua verificação.

No modo único , seu programa cria um mongoc_client_t diretamente:

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

O cliente se conecta sob demanda quando seu programa o usa pela primeira vez para uma operação do MongoDB . Usando um soquete sem bloqueio por servidor, ele inicia uma verificação em cada servidor simultaneamente e usa a função assíncrona poll ou select para receber eventos dos soquetes, até que todos tenham respondido ou atinja o tempo limite. Em outras palavras, no modo de thread único, o Driver C é ativado para iniciar todas as verificações simultaneamente e, em seguida, é ativado quando todas as verificações tiverem sido concluídas ou expiradas. Depois que a verificação for concluída, o cliente executará a operação do seu programa e retornará.

No modo único, o cliente verifica novamente a topologia do servidor aproximadamente uma vez por minuto. Se mais de um minuto tiver se passado desde a verificação anterior, a próxima operação no cliente será bloqueada enquanto o cliente conclui a verificação. Esse intervalo é configurável com heartbeatFrequencyMS na string de conexão. (Consulte mongoc_uri_t.)

Um único cliente abre uma conexão por servidor em sua topologia: essas conexões são usadas tanto para verificar a topologia quanto para executar operações normais.

Para ativar o modo pool, crie um 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);

Quando seu programa chama pela primeira vez mongoc_client_pool_pop, o pool inicia threads de monitoramento em segundo plano. Os threads de monitoramento se conectam independentemente a todos os servidores na string de conexão. À medida que os threads de monitoramento recebem respostas hello dos servidores, eles atualizam a visão compartilhada da topologia do servidor . Threads e conexões de monitoramento adicionais são criadas à medida que novos servidores são descobertos. Os threads de monitoramento são encerrados quando os servidores são removidos da exibição compartilhada da topologia do servidor .

Cada thread que executa operações MongoDB deve fazer check-out de um cliente do pool:

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

O mongoc_client_t o objeto não é seguro para threads, apenas o mongoc_client_pool_t é.

Quando o driver está no modo pool, as operações do seu programa são desbloqueadas assim que o monitoramento descobre um servidor utilizável. Por exemplo, se um thread em seu programa estiver esperando para executar uma "inserção" no primário, ele será desbloqueado assim que o primário for descoberto, em vez de esperar que todos os secundários também sejam verificados.

O pool abre uma conexão por servidor para monitoramento, e cada cliente abre sua própria conexão para cada servidor usado para operações de aplicação . Os threads de monitoramento em segundo plano verificam novamente os servidores de forma independente a cada 10 segundos. Esse intervalo é configurável com heartbeatFrequencyMS na string de conexão. (Consulte mongoc_uri_t.)

A string de conexão também pode especificar waitQueueTimeoutMS para limitar o tempo que mongoc_client_pool_pop esperará por um cliente da piscina. (Consulte mongoc_uri_t.) Se waitQueueTimeoutMS for especificado, será necessário confirmar se um cliente foi realmente retornado:

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 */
}

Consulte opções do pool de conexões para configurar o tamanho e o comportamento do pool e consulte mongoc_client_pool_t para obter um exemplo estendido de um programa multithread que usa o driver no modo pool .

Voltar

Conexões avançadas