El controlador C de MongoDB ofrece dos modos de conexión: monohilo y agrupado. Recomendamos usar el modo agrupado, especialmente para aplicaciones multihilo.
Importante
A diferencia de otros controladores de MongoDB, el controlador de C no implementa la especificación CMAP para la agrupación de conexiones. En el contexto del controlador de C, la agrupación de conexiones se refiere a la caché de objetos cliente del controlador, no a las conexiones a la base de datos.
Modo agrupado
Para utilizar el modo agrupado, cree un grupo de clientes mongoc:
mongoc_uri_t *uri = mongoc_uri_new("mongodb://hostA,hostB/?replicaSet=my_rs"); mongoc_client_pool_t *pool = mongoc_client_pool_new(uri);
Al llamar por primera vez a mongoc_client_pool_pop, el grupo inicia subprocesos de monitorización en segundo plano. Estos subprocesos se conectan de forma independiente a todos los servidores en la URI de conexión. A medida que reciben respuestas de saludo de los servidores, actualizan la vista compartida de la topología del servidor. El grupo crea subprocesos y conexiones de monitorización adicionales a medida que descubre nuevos servidores. Los subprocesos de monitorización finalizan cuando el grupo elimina servidores de la vista compartida de la topología del servidor.
Cada hilo que ejecuta operaciones de MongoDB debe extraer un cliente del grupo:
mongoc_client_t *client = mongoc_client_pool_pop(pool); /* use the client for operations ... */ mongoc_client_pool_push(pool, client);
Los objetos mongoc_client_t individuales no son seguros para subprocesos. Solo el objeto mongoc_client_pool_t proporciona seguridad para subprocesos.
En el modo agrupado, las operaciones del programa se desbloquean en cuanto la monitorización detecta un servidor utilizable. Por ejemplo, si un hilo del programa espera para ejecutar una "inserción" en el servidor principal, se desbloquea en cuanto se detecta, en lugar de esperar a que se verifiquen todos los servidores secundarios.
El grupo abre una conexión por servidor para la monitorización. Cada cliente abre su propia conexión a cada servidor que utiliza para las operaciones de la aplicación. Los subprocesos de monitorización en segundo plano vuelven a escanear los servidores de forma independiente aproximadamente cada 10 segundos. Puede configurar este intervalo especificando
heartbeatFrequencyMS opción en la URI de conexión. (Ver mongoc_uri_t).
El grupo de clientes crea un nuevo objeto mongoc_client_t cuando no hay ningún objeto de cliente disponible en el grupo y aún no se ha alcanzado el límite de maxPoolSize. El valor predeterminado de maxPoolSize es 100.
También puede especificar waitQueueTimeoutMS en la URI de conexión para limitar el tiempo que mongoc_client_pool_pop espera a un cliente del pool. (Consulte mongoc_uri_t). Si waitQueueTimeoutMS especifica, confirme que el pool realmente devuelve un cliente:
mongoc_client_t *client = mongoc_client_pool_pop(pool); if (client) { /* use the client for operations */ mongoc_client_pool_push(pool, client); } else { /* handle a wait queue timeout */ }
Tip
Para una alternativa no bloqueante a mongoc_client_pool_pop, utilice mongoc_client_pool_try_pop.
Consulta opciones del pool de conexiones para configurar el tamaño del grupo y el comportamiento. Consulte mongoc_client_pool_t para un ejemplo extendido de un programa multihilo que utiliza el driver en modo agrupado.
Modo de un solo subproceso
Para utilizar el modo de subproceso único, cree un mongoc_client_t directamente:
mongoc_client_t *client = mongoc_client_new( "mongodb://hostA,hostB/?replicaSet=my_rs");
El cliente se conecta bajo demanda la primera vez que lo usa para una operación de MongoDB. Mediante un socket no bloqueante por servidor, el cliente inicia una comprobación en cada servidor simultáneamente y utiliza la función asíncrona poll o select para recibir eventos de los sockets hasta que todos respondan o se agote el tiempo de espera. En el modo de un solo subproceso, el controlador C se expande para iniciar todas las comprobaciones simultáneamente y luego se expande una vez que todas las comprobaciones se completan o se agota el tiempo de espera. Una vez finalizado el escaneo, el cliente ejecuta la operación y regresa.
En el modo de un solo subproceso, el cliente vuelve a escanear la topología del servidor aproximadamente una vez por minuto. Si transcurre más de un minuto desde el escaneo anterior, la siguiente operación en el cliente se bloquea mientras este completa el suyo. Puede configurar este intervalo mediante el heartbeatFrequencyMS parámetro en la URI de conexión. (Consulte mongoc_uri_t).
Un cliente monohilo abre una conexión por servidor en su topología. Estas conexiones gestionan tanto el escaneo de la topología como las operaciones normales.
Tip
Puedes especificar la opción serverSelectionTryOne=false en tu URI de conexión para mejorar la resiliencia de la conexión de objetos cliente single-threader a MongoDB.