Overview
En esta guía, puede aprender sobre cómo el controlador Node.js usa grupos de conexiones para administrar las conexiones a una implementación de MongoDB y cómo puede configurar los ajustes del grupo de conexiones en su aplicación.
Un pool de conexiones es un caché de conexiones de base de datos abiertas, mantenido por el controlador de Node.js. Cuando su aplicación solicita una conexión a MongoDB, el controlador de Node.js obtiene una conexión del pool sin problemas, realiza operaciones y la devuelve al pool para su reutilización.
Los pools de conexiones ayudan a reducir la latencia de la aplicación y la cantidad de veces que se crean nuevas conexiones con el driver Node.js.
Configurar grupos de conexiones
Cada MongoClient La instancia tiene un grupo de conexiones integrado para cada servidor de su topología de MongoDB. Si no configura la opción minPoolSize, los grupos de conexiones abren sockets bajo demanda para admitir solicitudes simultáneas a MongoDB en su aplicación.
Puede especificar las siguientes configuraciones de grupo de conexiones en su instancia MongoClient:
Configuración | Descripción |
|---|---|
| The maximum number of concurrent connections that the pool maintains.
If the number of in-use connections to a server reaches the specified
value, the next request to that server waits until a connection becomes
available. Default: 100 |
| The maximum number of connections that each pool can establish
concurrently. |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of milliseconds that a connection can remain idle in
the pool. Set this value
higher than your application's expected idle period but lower than firewall
or proxy connection timeouts to prevent unexpected disconnections. Default: 0 (no limit) |
| The maximum number of milliseconds that a request can wait for a socket
to become available. Default: 0 (no limit) |
maxPoolSize
Además de los sockets necesarios para admitir las solicitudes de tu aplicación, cada instancia de MongoClient abre hasta dos conexiones por servidor en la topología de MongoDB para supervisión del estado del servidor.
Por ejemplo, un cliente conectado a un conjunto de réplicas de tres nodos abre seis sockets de monitorización. Si la aplicación usa la configuración predeterminada para maxPoolSize y solo consulta el nodo principal (predeterminado), puede haber como máximo 106 sockets abiertos y 100 conexiones en el grupo de conexiones. Si la aplicación usa un preferencia de lectura para consultar los nodos secundarios, esos grupos de conexiones crecen y puede haber 306 conexiones en total, incluidos los sockets de monitoreo abiertos.
Para admitir una gran cantidad de solicitudes MongoDB simultáneas dentro de un proceso, puede aumentar maxPoolSize.
El siguiente código crea una instancia MongoClient con un tamaño máximo de grupo de conexiones de 200 especificando la opción maxPoolSize en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxPoolSize: 200 });
maxConnecting
Los grupos de conexiones limitan la velocidad de establecimiento de conexiones. La opción maxConnecting determina el número de conexiones que el grupo puede crear en paralelo en cualquier momento. Por ejemplo, si el valor de maxConnecting es 2, la tercera solicitud que intenta verificar una conexión simultáneamente solo se realiza correctamente cuando se cumple una de las siguientes condiciones:
El grupo de conexiones termina de crear una conexión y hay menos de
maxPoolSizeconexiones en el grupo.Una conexión existente se vuelve a incluir en el grupo.
El siguiente código crea una instancia MongoClient con una cantidad máxima de 2 conexiones que se establecerán simultáneamente por grupo especificando la opción maxConnecting en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxConnecting: 2 });
minPoolSize
Puede establecer el número mínimo de conexiones a cada servidor con la opción minPoolSize. El controlador garantiza que siempre haya al menos el número de conexiones establecido por la opción minPoolSize en el grupo de conexiones. Si se cierran los sockets, lo que provoca que el número total de sockets (tanto en uso como inactivos) caiga por debajo del mínimo, se abren más sockets hasta alcanzarlo.
El siguiente código crea una instancia MongoClient con un tamaño de grupo de conexiones mínimo de 10 especificando la opción minPoolSize en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { minPoolSize: 10 });
Nota
Una configuración de MongoClient con maxIdleTimeMS y minPoolSize establecida en 0 es óptima para cargas de trabajo con periodos prolongados de baja actividad. Esta configuración permite que el grupo de conexiones cierre las conexiones no utilizadas durante periodos de inactividad.
En versiones anteriores a la 6.18.0, el controlador de Node.js no cerraba las conexiones inactivas cuando minPoolSize se configuraba en 0 durante periodos de inactividad. A partir de la versión 6.18.0, el grupo de conexiones cierra correctamente las conexiones inactivas independientemente de la configuración minPoolSize.
maxIdleTimeMS
Puede establecer el número máximo de milisegundos que una conexión puede permanecer inactiva en el pool configurando la opción maxIdleTimeMS. Una vez que una conexión ha estado inactiva durante maxIdleTimeMS, el pool la elimina y la reemplaza. El valor predeterminado de esta opción es 0 (sin límite).
El siguiente código crea una instancia MongoClient con un tiempo de inactividad máximo de 10000 milisegundos (10 segundos) al especificar la configuración maxIdleTimeMS en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxIdleTimeMS: 10000 });
waitQueueTimeoutMS
MongoClient Admite múltiples solicitudes simultáneas. Para cada proceso, cree un cliente y reutilícelo para todas las operaciones. Esta práctica es más eficiente que crear un cliente para cada solicitud.
El controlador no limita la cantidad de solicitudes que pueden esperar a que los sockets estén disponibles, y es responsabilidad de la aplicación limitar el tamaño de su grupo a la cola limitada durante un pico de carga. Las solicitudes esperan el tiempo especificado en la opción waitQueueTimeoutMS, cuyo valor predeterminado es 0 (sin límite).
Una solicitud que espera más tiempo del definido por waitQueueTimeoutMS para un socket genera un error de conexión. Use esta opción si es más importante limitar la duración de las operaciones durante un pico de carga que completar cada operación.
El siguiente código crea una instancia MongoClient con un tiempo de espera máximo de 10000 milisegundos (10 segundos) al declararla en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { waitQueueTimeoutMS: 10000 });
Cerrando conexiones
Cuando cualquier solicitud llama a MongoClient.close(), el controlador Node.js realiza las siguientes acciones:
Cierra todos los sockets inactivos en el grupo de conexiones
Cierra todos los enchufes que están en uso a medida que se devuelven al grupo.
Cierra todos los sockets que están en uso solo cuando se completan las operaciones asociadas
Llamar a MongoClient.close() solo cierra los sockets inactivos y no finaliza directamente ninguna operación en curso.
Nota
El método MongoClient.close() cierra sesiones y transacciones existentes, lo que podría afectar indirectamente el comportamiento de las operaciones en curso y los cursores abiertos.
Evitar tiempos de espera de sockets
Tener un gran grupo de conexiones no siempre reduce las solicitudes de reconexión. Considere el siguiente ejemplo:
Una aplicación tiene un tamaño de grupo de conexiones de 5 sockets y tiene la opción
socketTimeoutMSestablecida en 5000 milisegundos.Las operaciones ocurren, en promedio, cada 3000 milisegundos y las solicitudes de reconexión son frecuentes.
Cada socket expira después de 5000 milisegundos, lo que significa que todos los sockets deben hacer algo durante esos 5000 milisegundos para evitar cerrarse.
En este escenario, cada socket expira después de 5000 milisegundos, lo que requiere actividad durante este tiempo de espera para evitar el cierre. Sin embargo, un mensaje cada 3000 milisegundo no es suficiente para mantener todos los sockets activos, lo que provoca que varios de ellos expiran.
Para evitar tiempos de espera excesivos en los sockets, reduzca el número de conexiones que el controlador puede mantener en el pool de conexiones especificando la maxPoolSize opción. Para saber cómo configurar la maxPoolSize opción, consulte la sección maxPoolSize.
Documentación de la API
Para obtener más información sobre cómo crear un objeto MongoClient con el controlador Node.js y especificar opciones, consulte la siguiente documentación de API: