Overview
En esta guía, puedes aprender cómo el driver de Node.js utiliza el pool de conexiones para gestionar las conexiones a una implementación de MongoDB y cómo puedes configurar los ajustes del pool de conexiones en tu 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 pool de conexiones
Cada MongoClient La instancia tiene un grupo de conexiones incorporado para cada servidor en tu topología de MongoDB. Si no configuras la opción minPoolSize, los pools de conexiones abren sockets según sea necesario para admitir solicitudes concurrentes a MongoDB en tu aplicación.
Puedes especificar las siguientes configuraciones de pool de conexiones en tu instancia de 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 read preference para consultar los nodos secundarios, esos pools de conexión crecen y puede haber 306 conexiones totales, incluyendo los sockets de supervisión 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 de MongoClient con un tamaño máximo de pool 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 pool de conexiones termina de crear una conexión y hay menos de
maxPoolSizeconexiones en el pool.Se vuelve a registrar una conexión existente en el pool.
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 de MongoClient con un tamaño mínimo de grupo de conexiones de 10, al especificar la opción minPoolSize en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { minPoolSize: 10 });
Nota
Un MongoClient configurado con maxIdleTimeMS y minPoolSize establecido en 0 es óptimo para cargas de trabajo con períodos sostenidos de baja actividad. Esta configuración permite que el pool de conexiones cierre 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
Se puede configurar el número máximo de milisegundos que una conexión puede permanecer inactiva en el pool ajustando la opción maxIdleTimeMS. una vez que una conexión ha estado inactiva durante maxIdleTimeMS, el pool de conexiones la remueve y la reemplaza. Esta opción es por defecto 0 (sin límite).
El siguiente código crea una instancia de MongoClient con un tiempo de inactividad máximo de 10000 milisegundos (10 segundos) especificando 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 soporta múltiples solicitudes concurrentes. Para cada proceso, crea un cliente y reutilízalo para todas las operaciones en un proceso. 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 para limitar la cola durante un pico de carga. Las solicitudes esperan el tiempo especificado en la opción waitQueueTimeoutMS, que por defecto 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 de MongoClient con un tiempo de espera máximo de la fila de espera de 10000 milisegundos (10 segundos) declarándolo en el objeto options:
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { waitQueueTimeoutMS: 10000 });
Cierre de 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 pool de conexiones no siempre reduce las solicitudes de reconexión. Considera el siguiente escenario de ejemplo:
Una aplicación tiene un tamaño de pool de conexiones de 5 sockets y tiene la opción
socketTimeoutMSconfigurada 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 excesivos timeouts de socket, reduzca el número de conexiones que el driver puede mantener en el pool de conexiones especificando la opción maxPoolSize. Para aprender a configurar la opción maxPoolSize, consulta 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: