Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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).

Al usar el controlador Go para realizar una operación de servidor, también puede limitar el tiempo que el servidor tarda en finalizarla. El tiempo de espera se aplica a todos los pasos necesarios para completar la operación, incluyendo la selección del servidor, la verificación de la conexión y la ejecución del servidor. Cuando se agota el tiempo de espera, el controlador Go genera 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

  • Configuración del 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. Seleccione 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 transcurrido el tiempo de espera, el controlador devuelve un error de tiempo de espera. Consulte 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 que se utilizará para completar la operación.

0

Especifica que las operaciones nunca expiran.

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 anulaciones y opciones específicas, consulte la siguiente sección Anulaciones.

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

Puede especificar una opción timeoutMS en un nivel más específico para anular la configuración del cliente. La tabla de la sección anterior describe los niveles en los que puede especificar un tiempo de espera. Esto le permite personalizar los tiempos de espera según las necesidades de cada operación.

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 realiza una transacción utilizando el método WithTransaction(), puede aplicar un tiempo de espera a las operaciones de transacción configurando un tiempo de espera 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 especifica un tiempo de espera de contexto, el controlador hereda el valor de tiempo de espera establecido en el elemento 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 la Transactions guide.

Los cursores ofrecen opciones de tiempo de espera configurables al usar la función CSOT. Puede ajustar los tiempos de espera del cursor pasando contextos con especificaciones de tiempo de espera a los métodos del cursor.

Para las operaciones que crean cursores, la configuración del 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 obtener más información sobre el uso de tiempos de espera con el controlador Go, consulte la siguiente documentación de API:

Volver

Stable API

En esta página