El controlador C de MongoDB ofrece dos modos de conexión: monohilo y agrupado. El modo monohilo está optimizado para integrar el controlador en lenguajes como PHP. Los programas multihilo deberían usar el modo agrupado: este modo minimiza el número total de conexiones y, en este modo, los subprocesos en segundo plano supervisan la topología del servidor MongoDB, por lo que el programa no necesita bloquearse para escanearla.
Modo único
En el modo único, su programa crea un mongoc_client_t directamente:
mongoc_client_t *client = mongoc_client_new ( "mongodb://hostA,hostB/?replicaSet=my_rs");
El cliente se conecta bajo demanda cuando su programa lo utiliza por primera vez para una operación de MongoDB. Mediante un socket no bloqueante por servidor, inicia una comprobación en cada servidor simultáneamente y utiliza el protocolo asíncrono. poll o la función select para recibir eventos de los sockets hasta que todos respondan o se agote el tiempo de espera. Dicho de otro modo, en modo monohilo, el controlador C se expande para iniciar todas las comprobaciones simultáneamente y luego se expande una vez que todas las comprobaciones se hayan completado o se agote el tiempo de espera. Una vez finalizado el escaneo, el cliente ejecuta la operación del programa y regresa.
En modo único, el cliente vuelve a escanear la topología del servidor aproximadamente una vez por minuto. Si ha transcurrido más de un minuto desde el escaneo anterior, la siguiente operación en el cliente se bloqueará mientras este completa su escaneo. Este intervalo se puede configurar con heartbeatFrequencyMS en la cadena de conexión. (Consulte mongoc_uri_t).
Un solo cliente abre una conexión por servidor en su topología: estas conexiones se utilizan tanto para escanear la topología como para realizar operaciones normales.
Modo agrupado
Para activar el modo agrupado, cree un 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);
Cuando su programa llama por primera vez a mongoc_client_pool_pop, el pool inicia subprocesos de monitorización en segundo plano. Estos subprocesos se conectan de forma independiente a todos los servidores de la cadena de conexión. A medida que reciben respuestas de saludo de los servidores, actualizan la vista compartida de la topología del servidor. Se crean subprocesos y conexiones de monitorización adicionales a medida que se descubren nuevos servidores. Los subprocesos de monitorización finalizan cuando se eliminan los 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);
El objeto mongoc_client_t no es seguro para subprocesos, solo lo es mongoc_client_pool_t.
Cuando el controlador está en 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 ejecutar una "inserción" en el servidor principal, se desbloquea en cuanto se detecta este, en lugar de esperar a que se comprueben también todos los servidores secundarios.
El grupo abre una conexión por servidor para la monitorización, y 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 reescanean los servidores de forma independiente aproximadamente cada 10 segundos. Este intervalo se puede configurar con heartbeatFrequencyMS en la cadena de conexión. (Consulte mongoc_uri_t).
La cadena de conexión también puede especificar waitQueueTimeoutMS para limitar el tiempo que mongoc_client_pool_pop esperará a un cliente del pool. (Consulte mongoc_uri_t). Si waitQueueTimeoutMS se especifica, es necesario confirmar que se devolvió un cliente:
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 las opciones del grupo de conexiones para configurar el tamaño y el comportamiento del grupo, y consulte mongoc_client_pool_t para ver un ejemplo extendido de un programa multiproceso que utiliza el controlador en modo agrupado.