Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Gestionar las conexiones con los pools de conexión

En esta guía, puedes aprender sobre cómo el driver Ruby utiliza pools 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 driver de Ruby. Cuando tu aplicación solicita una conexión a MongoDB, el controlador obtiene sin problemas una conexión del pool, realiza las operaciones y devuelve la conexión al pool para su reutilización.

Los grupos de conexiones ayudan a reducir la latencia de la aplicación y la cantidad de veces que el driver de Ruby crea nuevas conexiones.

Cada Mongo::Client La instancia tiene un pool de conexiones integrado para cada servidor en su topología de MongoDB. Si no configura la opción min_pool_size, los pools de conexiones abren conexiones on-demand para admitir solicitudes simultáneas en MongoDB en su aplicación.

Puedes especificar las siguientes configuraciones de pool de conexiones en tu instancia de Mongo::Client:

Configuración
Descripción

max_pool_size

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. Setting this option to 0 creates an unlimited connection pool.

Default: 100

max_connecting

The maximum number of connections that each pool can establish concurrently.

Default: 2

min_pool_size

The minimum number of concurrent connections that the pool maintains.

Default: 0

max_idle_time

The maximum number of seconds that a connection can remain idle in the pool.

Default: 0 (no limit)

Además de las conexiones necesarias para recibir las solicitudes de tu aplicación, cada instancia de Mongo::Client abre hasta dos conexiones por servidor en tu topología de MongoDB para supervisar el estado del servidor.

Por ejemplo, un cliente conectado a un set de réplicas de tres nodos abre seis conexiones de supervisión. Si la aplicación utiliza la configuración predeterminada para max_pool_size y solo consulta el nodo principal (predeterminado), entonces puede haber como máximo 106 conexiones abiertas y 100 conexiones en el pool de conexiones. Si la aplicación utiliza un preferencia de lectura para consultar los nodos secundarios, esos grupos de conexiones crecen y puede haber 306 conexiones en total, incluidas las conexiones de monitoreo abiertas.

Para admitir una gran cantidad de solicitudes MongoDB simultáneas dentro de un proceso, puede aumentar max_pool_size.

El siguiente código crea una instancia de Mongo::Client con un tamaño máximo de pool de conexiones de 200 especificando la opción max_pool_size en el objeto options:

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_pool_size: 200
})

Los grupos de conexiones limitan la velocidad de establecimiento de conexiones. La opción max_connecting determina el número de conexiones que el grupo puede crear en paralelo en cualquier momento. Por ejemplo, si el valor de max_connecting 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 max_pool_size conexiones en el pool.

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

El siguiente código crea una instancia Mongo::Client con una cantidad máxima de 2 conexiones que se establecerán simultáneamente por grupo especificando la opción max_connecting en el objeto options:

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_connecting: 2
})

Puede establecer el número mínimo de conexiones a cada servidor con la opción min_pool_size. El controlador garantiza que siempre haya al menos el número de conexiones establecido por la opción min_pool_size en el grupo de conexiones. Si se cierran las conexiones, lo que provoca que el número total de conexiones (tanto en uso como inactivas) caiga por debajo del mínimo, el controlador abre más conexiones hasta alcanzarlo.

El siguiente código crea una instancia de Mongo::Client con un tamaño mínimo de pool de conexiones de 10 especificando la opción min_pool_size en el objeto options:

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
min_pool_size: 10
})

Nota

Un Mongo::Client configurado con max_idle_time y min_pool_size 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.

Se puede configurar el número máximo de milisegundos que una conexión puede permanecer inactiva en el pool ajustando la opción max_idle_time. una vez que una conexión ha estado inactiva durante max_idle_time, 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 Mongo::Client con un tiempo de inactividad máximo de 10000 milisegundos (10 segundos) especificando la configuración max_idle_time en el objeto options:

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_idle_time: 10000
})

Cuando cualquier solicitud llama a Mongo::Client.close(), el driver Ruby realiza las siguientes acciones:

  • Cierra todas las conexiones inactivas en el pool de conexiones

  • Cierra todas las conexiones que se estén utilizando en el momento en que se devuelvan al pool.

  • Cierra todas las conexiones que están en uso solo cuando se completan las operaciones asociadas.

Llamar a Mongo::Client.close() cierra solo las conexiones inactivas y no termina directamente ninguna operación en curso.

Nota

El método Mongo::Client.close() cierra 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 grupo de conexiones de 5 conexiones y tiene la opción timeout_ms establecida en 5000 milisegundos.

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

  • Cada conexión se agota después de 5000 milisegundos, lo que significa que todas las conexiones deben realizar alguna acción durante esos 5000 milisegundos para evitar cerrar.

En este escenario, cada conexión se agota después de 5000 milisegundos, requiriendo actividad dentro de este período de tiempo de espera para evitar el cierre. Sin embargo, un mensaje cada 3000 milisegundos no es suficiente para mantener todas las conexiones activas, lo que provoca que varias de ellas agoten el tiempo de espera.

Para evitar tiempos de espera de conexión excesivos, reduzca el número de conexiones que el controlador puede mantener en el grupo de conexiones especificando la max_pool_size opción. Para saber cómo configurar la max_pool_size opción, consulte la sección "max_pool_size" de esta guía.

Para obtener más información sobre cómo crear un objeto Mongo::Client con el driver Ruby y especificar opciones, consulta la sección Hash de opciones de la documentación de la API Mongo::Client.

Volver

Limite el tiempo de ejecución del servidor

En esta página