Pool de conexões
Nesta página
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.
Modo Único
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.
Modo Agrupado
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 .