Docs Menu
Docs Home
/ /

Pools de conexiones

En esta guía, puede aprender cómo el controlador Go usa grupos de conexiones para administrar 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 de Go. Cuando su aplicación solicita una conexión a MongoDB, el controlador de Go 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 el número de veces que se crean nuevas conexiones mediante el driver Go.

Cada Client La instancia tiene un grupo de conexiones integrado para cada servidor en su topología de MongoDB. Si no configura la opción minPoolSize, los grupos de conexiones abren sockets bajo demanda. Estos sockets admiten operaciones simultáneas de MongoDB, o goroutines, en su aplicación.

Cuando se crea una nueva instancia Client, se abren dos sockets 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 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 preferencia de lectura para consultar los nodos secundarios, sus grupos también crecen y puede haber 306 conexiones en total.

Para mayor eficiencia, cree un cliente para cada proceso y reutilícelo para todas las operaciones. Evite crear un cliente nuevo para cada solicitud, ya que esto aumentará la latencia.

Si los sockets se cierran debido a algún error de red, 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 que se alcanza el mínimo.

Puedes especificar la configuración de tu pool de conexión utilizando una cadena de conexión o los métodos options.Client.

Seleccione el Connection String o la pestaña ClientOptions para ver la sintaxis correspondiente:

Las siguientes son configuraciones de cadena de conexión que puede utilizar para configurar su grupo de conexiones:

Configuración
Descripción

maxPoolSize

Número máximo de conexiones abiertas en el pool. Si una operación necesita una nueva conexión mientras el pool tiene maxPoolSize conexiones abiertas, la nueva operación espera a que se abra una nueva conexión. Para limitar este tiempo de espera, utilice la configuración de tiempo de espera único.

Por defecto: 100

minPoolSize

Número mínimo de conexiones abiertas en el pool. El pool de conexiones se inicializa con este número de sockets. El valor de minPoolSize debe ser menor que el valor de maxPoolSize.

Por defecto: 0

maxConnecting

Número máximo de conexiones que un grupo puede establecer simultáneamente.

Por defecto: 2

maxIdleTimeMS

El número máximo de milisegundos que una conexión puede permanecer inactiva en el pool antes de ser eliminada y cerrada. Configure este valor por encima del tiempo de inactividad esperado de su aplicación, pero por debajo de los tiempos de espera de conexión del firewall o proxy para evitar desconexiones inesperadas.

Por defecto: 0 (no limit)

waitQueueTimeoutMS`

Especifica el tiempo máximo de espera en milisegundos que un subproceso puede esperar hasta que una conexión esté disponible. Una operación que espera un socket durante más tiempo del especificado genera un error de conexión.

Default: 0 (no limit)

La siguiente tabla describe los métodos que puede encadenar a su configuración para modificar el comportamiento del controlador:

Configuración
Descripción

SetMaxPoolSize()

Número máximo de conexiones abiertas en el grupo. Si una operación necesita una nueva conexión mientras el pool de conexiones tiene el máximo de conexiones configurado abiertas, la nueva operación esperará a que se abra una nueva conexión. Para limitar este tiempo de espera, utilice la configuración de tiempo de espera único.

Por defecto: 100

SetMinPoolSize()

Número mínimo de conexiones abiertas en el pool. El valor de MinPoolSize debe ser menor que el valor de MaxPoolSize.

Por defecto: 0

SetMaxConnecting()

Número máximo de conexiones que un grupo puede establecer simultáneamente.

Por defecto: 2

SetMaxConnIdleTime()

El número máximo de milisegundos que una conexión puede permanecer inactiva en el pool antes de ser eliminada y cerrada.

Por defecto: 0 (no limit)

Selecciona la pestaña Connection String o ClientOptions para ver el ejemplo correspondiente:

El siguiente código utiliza la cadena de conexión para configurar el tamaño máximo del grupo de conexiones de 50, un tamaño mínimo del grupo de 10 y un tiempo de inactividad máximo de 30000 milisegundos (30 segundos):

// Connection string with connection pool options
const uri = "mongodb://localhost:27017/?maxPoolSize=50&minPoolSize=10&maxIdleTimeMS=30000"

El siguiente código crea un cliente y pasa la cadena de conexión al método ApplyURI():

// Creates a new client and connects to the server
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
log.Fatal(err)
}

El siguiente código crea un cliente y establece las opciones del grupo de conexiones con un tamaño máximo de grupo de conexiones de 50, un tamaño mínimo de grupo de 10 y un tiempo de inactividad máximo de 30000 milisegundos (30 segundos):

// Sets client options with connection pool settings
clientOptions := options.Client().
ApplyURI(uri).
SetMaxPoolSize(50).
SetMinPoolSize(10).
SetMaxConnIdleTime(30 * time.Second)
// Creates a new client and connects to the server
client, err := mongo.Connect(clientOptions)
if err != nil {
log.Fatal(err)
}

Los grupos de conexiones tienen una tasa limitada, de modo que cada uno solo puede crear, como máximo, maxConnecting conexiones en paralelo en cualquier momento. Cualquier nueva goroutine deja de esperar en los siguientes casos:

  • Una de las goroutine existentes termina de crear una conexión, o una conexión existente se devuelve al grupo.

  • La capacidad del controlador para reutilizar conexiones existentes mejora debido a los límites de velocidad en la creación de conexiones.

El controlador no limita el número de operaciones que pueden esperar a que los sockets estén disponibles, por lo que es responsabilidad de la aplicación gestionar su cola de operaciones. Las operaciones pueden esperar cualquier tiempo, a menos que se defina la opción waitQueueTimeoutMS.

Una operación 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.

Cuando se llama a Client.Disconnect() desde cualquier goroutine, el controlador cierra todos los sockets inactivos y luego cierra todos los sockets a medida que se devuelven al grupo.

Para obtener más información sobre el uso de un grupo de conexiones, consulte la documentación del grupo de conexiones en el manual del servidor.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Limite el tiempo de ejecución del servidor

En esta página