Overview
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.
Configurar pool de conexiones
Cada instancia de Mongo::Client tiene un grupo de conexiones integrado para cada servidor en la topología de MongoDB. Si no configura la opción min_pool_size, los pools de conexiones abren conexiones on-demand para soportar solicitudes concurrentes a MongoDB en su aplicación.
Puedes especificar las siguientes configuraciones de pool de conexiones en tu instancia de Mongo::Client:
Configuración | Descripción |
|---|---|
| Número máximo de conexiones simultáneas que mantiene el grupo de conexiones. 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. Al establecer esta opción en, se |
| Número máximo de conexiones que cada grupo puede establecer simultáneamente. |
| El número mínimo de conexiones simultáneas que mantiene el pool. |
| Número máximo de segundos que una conexión puede permanecer inactiva en el grupo. |
max_pool_size
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 realiza consultas al nodo primario (por defecto), entonces puede haber como máximo 106 conexiones abiertas y 100 conexiones en el pool de conexiones. Si la aplicación utiliza una preferencia de lectura para consultar los nodos secundarios, esos grupos de conexiones crecen y puede haber 306 conexiones totales, incluidas las conexiones de supervisión abiertas.
Para gestionar un gran número de solicitudes concurrentes de MongoDB dentro de un mismo proceso, se 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 })
max_connecting
Los grupos de conexiones limitan la tasa 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 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
max_pool_sizeconexiones en el pool.Se vuelve a registrar una conexión existente en el pool.
El siguiente código crea una instancia de Mongo::Client con un número máximo de 2 conexiones que se pueden establecer 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 })
min_pool_size
Puedes establecer el número mínimo de conexiones a cada servidor con la opción min_pool_size. El driver garantiza que siempre haya al menos el número de conexiones establecidas por la opción min_pool_size en el pool de conexiones. Si se cierran conexiones y la cantidad total de conexiones (tanto en uso como inactivas) cae por debajo del mínimo, el controlador abre más conexiones hasta que se alcance el mínimo.
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.
tiempo_máximo_inactivo
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 })
Cierre de conexiones
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() sí cierra las sesiones y transacciones existentes, lo que podría afectar indirectamente el comportamiento de las operaciones en curso y los cursores abiertos.
Evite los tiempos de espera de conexión.
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 conexiones y la opción
timeout_msestablecida 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 un número excesivo de tiempos de espera de conexión, reduce el número de conexiones que el driver puede mantener en el pool de conexiones especificando la opción max_pool_size. Para aprender a configurar la opción max_pool_size, consulta la sección max_pool_size de esta guía.
Documentación de la API
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.