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

Limite el tiempo de ejecución del servidor

En esta guía, puedes aprender sobre la configuración de tiempo de espera único en el controlador de Go, también conocida como el tiempo de espera de la operación en el lado del cliente (CSOT).

Cuando utilizas el controlador Go para realizar una operación en el servidor, también puedes limitar la cantidad de tiempo en el que el servidor puede finalizar la operación. El tiempo de espera se aplica a todos los pasos necesarios para completar la operación, incluida la selección del servidor, la verificación de la conexión y la ejecución del lado del servidor. Cuando expire el tiempo de espera, el driver de Go lanzará una excepción de tiempo de espera.

Nota

Funcionalidad Experimental

La funcionalidad CSOT es experimental y podría cambiar en futuras versiones de driver.

Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure el timeoutMS opción de conexión para la duración del tiempo de espera en milisegundos. Puedes establecer la opción timeoutMS de las siguientes maneras:

  • Invocar el método SetTimeout() al especificar opciones para tu instancia Client

  • Configurar el parámetro timeoutMS en su cadena de conexión

Los siguientes ejemplos de código establecen un tiempo de espera a nivel de cliente de 200 milisegundos. Selecciona el Client o la pestaña Connection String para ver el código correspondiente.

opts := options.Client().SetTimeout(200 * time.Millisecond)
client, err := mongo.Connect(opts)
uri := "<connection string>/?timeoutMS=200"
client, err := mongo.Connect(options.Client().ApplyURI(uri))

Nota

Reintentos según la especificación de tiempo de espera

Si se establece un tiempo de espera en tu Client o en un Contexto a nivel de operación y el servidor devuelve un error recuperable, el controlador intenta la operación tantas veces como sea posible antes de que expire el tiempo de espera.

Una vez que el tiempo de espera expire, el controlador devuelve un error de tiempo de espera. Consulta el manual del servidor para obtener más información sobre lecturas repetibles y escrituras repetibles.

La siguiente tabla describe el comportamiento de espera correspondiente a los valores aceptados para timeoutMS:

Valor
Comportamiento

Número entero positivo

Establece el tiempo de espera a utilizar para la finalización de la operación.

0

Especifica que las operaciones nunca se agotan.

null o desactivar

Defers the timeout behavior to the following settings:
These settings are deprecated and are ignored if you set timeoutMS.

Si se especifica la opción timeoutMS, el driver aplicará automáticamente el tiempo de espera especificado a cada operación del servidor.

Por defecto, todas las operaciones de tu aplicación heredan la opción Timeout de Client si no configuras un tiempo de espera diferente para operaciones específicas en el Contexto de la operación.

Si configuras un tiempo de espera en un contexto pasado a una operación, el controlador utiliza ese valor para la operación. Si no especificas un tiempo de espera para un contexto, el contexto de operación derivará el tiempo de espera de la instancia Client.

La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:

Nivel
Descripción de herencia

Operación

Tiene la máxima prioridad y anula las opciones de tiempo de espera que estableciste en cualquier otro nivel.

transacción

Toma precedencia sobre el valor de tiempo de espera que establece a nivel de cliente.

Cliente

Se aplica a todas las bases de datos, colecciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen de otro modo un tiempo de espera de Contexto.

Para obtener más información sobre las anulaciones y las opciones específicas, consulta la siguiente sección de Anulaciones.

El driver Go admite varios niveles de configuración para controlar el comportamiento y el rendimiento de las operaciones de base de datos.

Puedes especificar una opción timeoutMS a un nivel más específico para anular la configuración a nivel de cliente. La tabla en la sección anterior describe los niveles en los que se puede especificar una configuración de tiempo de espera (timeout). Esto permite personalizar los tiempos de espera según las necesidades de las operaciones individuales.

El siguiente ejemplo muestra cómo establecer un tiempo de espera a nivel de operación en un Context, que tiene prioridad sobre el tiempo de espera a nivel del cliente:

opts = options.Client().SetTimeout(200 * time.Millisecond)
client, err = mongo.Connect(opts)
if err != nil {
log.Fatal(err)
}
coll := client.Database("db").Collection("people")
ctx, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond)
defer cancel()
_, err = coll.InsertOne(ctx, bson.D{{"name", "Agnes Georgiou"}})

Cuando realizas una transacción usando el método WithTransaction(), puedes aplicar un tiempo de espera a las operaciones de la transacción estableciendo un timeout dentro del contexto.

El siguiente código demuestra cómo establecer un tiempo de espera de Context al llamar al método WithTransaction() para realizar una transacción:

txnContext, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond)
defer cancel()
result, err := session.WithTransaction(txnContext, func(ctx context.Context) (string, error) {
// Perform transaction operations
})

Si no especificas un tiempo de espera de contexto, el controlador hereda el valor de tiempo de espera establecido en el principal Client.

También puedes pasar límites de tiempo de contexto a los siguientes métodos de sesión:

  • AbortTransaction()

  • CommitTransaction()

  • EndSession()

Para obtener más información sobre las transacciones, consulte Transactions guide.

Los cursores ofrecen configuraciones de tiempo de espera configurables cuando se utiliza la funcionalidad CSOT. Puedes ajustar los tiempos de espera del cursor pasando Contextos que tengan especificaciones de tiempo de espera a los métodos de Cursor.

Para las operaciones que crean cursores, la configuración de tiempo de espera puede limitar la vida útil del cursor o aplicarse por separado a la operación original y a todas las llamadas posteriores.

Por ejemplo, si pasas un tiempo de espera Context al método Cursor.Next(), el tiempo de espera se aplica a cada acción para obtener un documento de resultado. Si pasa un tiempo de espera Context al método Cursor.All(), el tiempo de espera se aplica a toda la vida útil del cursor.

Para obtener más información sobre los cursores, consulte la Guía de acceso a datos desde un cursor.

Para aprender más sobre el uso de timeouts con el driver de Go, consulta la siguiente documentación de API:

Volver

Stable API

En esta página