Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Gestionar las conexiones con los pools de conexión

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 una caché de conexiones abiertas a bases de datos mantenida por el controlador de Node.js. Cuando tu aplicación solicita una conexión a MongoDB, el controlador de Node.js obtiene sin problema una conexión del conjunto, realiza operaciones y devuelve la conexión al conjunto para que se pueda reutilizar.

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.

Cada instancia de MongoClient tiene un pool de conexiones integrado para cada servidor en tu topología de MongoDB. Si no configuras la opción minPoolSize, los pools de conexiones abren sockets on-demand para respaldar 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

maxPoolSize

Número máximo de conexiones simultáneas que mantiene el grupo. Si el número de conexiones en uso a un servidor alcanza el valor especificado, la siguiente solicitud a ese servidor espera hasta que haya una conexión disponible.

Valor predeterminado: 100

maxConnecting

El número máximo de conexiones que cada grupo puede establecer simultáneamente.

minPoolSize

Número mínimo de conexiones simultáneas que mantiene el pool.

Valor predeterminado: 0

maxIdleTimeMS

Número máximo de milisegundos que una conexión puede permanecer inactiva en el grupo. Establezca este valor por encima del período de inactividad previsto para su aplicación, pero por debajo de los tiempos de espera de conexión del firewall o del proxy para evitar desconexiones inesperadas.

Valor predeterminado: 0 (sin límite).

waitQueueTimeoutMS

Número máximo de milisegundos que una solicitud puede esperar a que un socket esté disponible.

Valor predeterminado: 0 (sin límite).

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 supervisión. Si la aplicación utiliza la configuración predeterminada para maxPoolSize y solo consulta el nodo primario (predeterminado), entonces puede haber como máximo 106 sockets abiertos y 100 conexiones en el pool de conexiones. Si la aplicación utiliza una preferencia de lectura para query los nodos secundarios, esos pools de conexiones crecen y puede haber 306 conexiones totales, incluidos los sockets de supervisión abiertos.

Para gestionar un gran número de solicitudes concurrentes de MongoDB dentro de un mismo proceso, se 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
});

Los grupos de conexiones limitan la tasa 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 obtener una conexión de manera simultánea solo tiene éxito cuando ocurre uno de los siguientes casos:

  • El pool de conexiones termina de crear una conexión y hay menos de maxPoolSize conexiones en el pool.

  • Se vuelve a registrar una conexión existente en el pool.

El siguiente código crea una instancia de MongoClient con un número máximo de 2 conexiones que se pueden establecer 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
});

Puedes establecer el número mínimo de conexiones a cada servidor con la opción minPoolSize. El driver garantiza que siempre haya al menos el número de conexiones establecidas por la opción minPoolSize en el pool de conexiones. Si se cierran los sockets, lo que provoca que el número total de sockets (en uso e inactivos) caiga por debajo del mínimo, se abren más sockets hasta alcanzar el mínimo.

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 6.18.0, el controlador de Node.js no cerraba las conexiones inactivas cuando minPoolSize se configuraba en 0 durante períodos de inactividad. A partir de la versión 6.18.0, el pool de conexiones cierra correctamente las conexiones inactivas independientemente de la configuración de minPoolSize.

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
});

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 del tiempo definido por waitQueueTimeoutMS para un socket genera un error de conexión. Utiliza esta opción si es más importante delimitar 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
});

Cuando cualquier solicitud llama a MongoClient.close(), el driver de Node.js realiza las siguientes acciones:

  • Cierra todos los sockets inactivos en el pool de conexiones

  • Cierra todos los sockets que están en uso a medida que se devuelven al pool

  • Cierra todos los sockets que están en uso solo cuando se completan las operaciones asociadas

Llamar a MongoClient.close() cierra solo sockets inactivos y no termina directamente ninguna operación en curso.

Nota

El método MongoClient.close() sí cierra las sesiones y transacciones existentes, lo que podría afectar indirectamente el comportamiento de las operaciones en curso y los cursores abiertos.

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 socketTimeoutMS configurada en 5000 milisegundos.

  • Las operaciones ocurren, en promedio, cada 3000 milisegundos, y las solicitudes de reconexión son frecuentes.

  • Cada socket se agota 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 se agota después de 5000 milisegundos, requiriendo actividad dentro de este periodo de tiempo de espera para evitar el cierre. Sin embargo, un mensaje cada 3000 milisegundos no es suficiente para mantener todos los sockets activos, lo que hace que varios de ellos expiren por tiempo de espera.

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.

Para más información sobre cómo crear un objeto MongoClient con el driver de Node.js y especificar opciones, consulta la siguiente documentación de la API: