Docs Menu
Docs Home
/ /

Administrar conexiones con grupos de conexiones

En esta guía, puede aprender cómo el controlador Ruby 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 Ruby. Cuando su aplicación solicita una conexión a MongoDB, el controlador obtiene una conexión del pool sin problemas, realiza operaciones y la devuelve 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 controlador Ruby crea nuevas conexiones.

Cada Mongo::Client La instancia tiene un grupo de conexiones integrado para cada servidor de su topología de MongoDB. Si no configura la opción min_pool_size, los grupos de conexiones abren conexiones 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 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 respaldar las solicitudes de su aplicación, cada instancia Mongo::Client abre hasta dos conexiones por servidor en su topología MongoDB para monitorear el estado del servidor.

Por ejemplo, un cliente conectado a un conjunto de réplicas de tres nodos abre seis conexiones de monitorización. Si la aplicación usa la configuración predeterminada para max_pool_size y solo consulta el nodo principal (predeterminado), puede haber como máximo 106 conexiones abiertas 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, 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 Mongo::Client con un tamaño máximo de grupo 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 grupo de conexiones termina de crear una conexión y hay menos de max_pool_size conexiones en el grupo.

  • Una conexión existente se vuelve a incluir en el grupo.

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 Mongo::Client con un tamaño de grupo de conexiones mínimo 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

Una configuración de Mongo::Client con max_idle_time y min_pool_size 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.

Puede establecer el número máximo de milisegundos que una conexión puede permanecer inactiva en el pool configurando la opción max_idle_time. Una vez que una conexión ha estado inactiva durante max_idle_time, 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 Mongo::Client con un tiempo de inactividad máximo de 10000 milisegundos (10 segundos) al especificar 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 controlador Ruby realiza las siguientes acciones:

  • Cierra todas las conexiones inactivas en el grupo 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() solo cierra las conexiones inactivas y no finaliza 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 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 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 expira después de 5000 milisegundos, lo que significa que todas las conexiones deben hacer algo durante esos 5000 milisegundos para evitar cerrarse.

En este escenario, cada conexión 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 todas las conexiones activas, lo que provoca que varias de ellas expiran.

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 Mongo::Client objeto con el controlador Ruby y especificar opciones, consulte la sección Hash de opciones de la documentación de la API de Mongo::Client.

Volver

Limite el tiempo de ejecución del servidor

En esta página