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

Pools de conexiones

En esta guía, puedes aprender cómo el driver Go utiliza pools de conexiones para gestionar las conexiones con una implementación de MongoDB y cómo puedes configurar la configuración del pool de conexiones en tu aplicación.

Un pool de conexiones es una caché de conexiones abiertas a la base de datos que mantiene el controlador de Go. Cuando su aplicación solicita una conexión a MongoDB, el controlador Go obtiene sin problemas una conexión del grupo, realiza operaciones y devuelve la conexión al grupo 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 instancia tiene una pool de conexiones incorporada para cada servidor en su topología de MongoDB. Si no configura la opción minPoolSize, los pools de conexiones abren sockets on-demand. Estos sockets admiten operaciones de MongoDB simultáneas, o goroutines, en tu aplicación.

Cuando se instancia una nueva instancia de Client, se abren dos sockets 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 sockets de supervisión. Si la aplicación usa la configuración por defecto para maxPoolSize y solo query el nodo primario (por defecto), entonces puede haber como máximo 106 sockets abiertos y 100 conexiones en el pool de conexiones. Si la aplicación utiliza un preferencias de lectura para query los nodos secundarios, sus agrupaciones también pueden aumentar y puede haber 306 conexiones totales.

Para mayor eficiencia, crea un cliente para cada proceso y reutilízalo en todas las operaciones. Evite crear un nuevo cliente para cada solicitud porque esto aumentará la latencia.

Si los sockets se cierran debido a errores 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.

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

Las siguientes son configuraciones de cadenas de conexión que puedes usar para configurar tu pool 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 de conexiones tiene maxPoolSize conexiones abiertas, la nueva operación espera 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 pool puede establecer de manera simultánea.

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. Establece este valor más alto que el período de inactividad esperado por tu aplicación, pero más bajo que los tiempos de espera por conexión del firewall o del proxy para prevenir desconexiones inesperadas.

Por defecto: 0 (no limit)

waitQueueTimeoutMS`

Especifica el tiempo máximo de espera, en milisegundos, que un thread puede esperar para que una conexión esté disponible. Una operación que espera un socket más tiempo del definido por este plazo generará un error de conexión.

Default: 0 (no limit)

La siguiente tabla describe los métodos que puedes encadenar a tu configuración para modificar el comportamiento del driver:

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 pool puede establecer de manera simultánea.

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 pool de conexiones de 50, un tamaño mínimo del pool de conexiones de 10 y un tiempo máximo de inactividad 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 pool de conexiones con un tamaño máximo de pool de conexiones de 50, un tamaño mínimo de pool de 10 y un tiempo máximo de inactividad 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 pools de conexiones tienen un límite de velocidad que permite a cada pool de conexiones crear, como máximo, el valor de maxConnecting conexiones en paralelo en cualquier momento. Cualquier nueva goroutine deja de esperar en los siguientes casos:

  • Una de las goroutines existentes termina de crear una conexión, o una conexión existente se registra de nuevo en el pool.

  • 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 administrar su cola de operaciones. Las operaciones pueden esperar cualquier cantidad de tiempo, a menos que defina la opción waitQueueTimeoutMS.

Una operación que espera más del tiempo definido por waitQueueTimeoutMS para un socket genera un error de conexión. Utilice 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 llamas 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 pool.

Para más información sobre el uso de un pool de conexiones, consulta la documentación de la pool de conexiones en el manual de 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