Docs Menu
Docs Home
/ /

Limite el tiempo de ejecución del servidor

En esta guía, puede obtener información sobre la configuración de tiempo de espera único en el controlador Go, también conocido como tiempo de espera de operación del 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

Característica experimental

La función CSOT es experimental y podría cambiar en futuras versiones de controladores.

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. Puede configurar la opción timeoutMS de las siguientes maneras:

  • Llamar al método SetTimeout() al especificar opciones para su 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 bajo la especificación de tiempo de espera

Si establece un tiempo de espera en su Client o en un contexto de nivel de operación y el servidor devuelve un error que se puede volver a intentar, el controlador vuelve a intentar 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 reintentables y escrituras reintentables.

La siguiente tabla describe el comportamiento del tiempo 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 desconfigurado

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

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

De forma predeterminada, todas las operaciones de su aplicación heredan la opción Timeout de Client si no establece un tiempo de espera diferente para operaciones específicas en el contexto de la operación.

Si se establece un tiempo de espera en un contexto pasado a una operación, el controlador utiliza ese valor para la operación. Si no se especifica un tiempo de espera para el contexto, el contexto de la operación lo deriva de la instancia Client.

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

Nivel
Descripción de la herencia

Operación

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

Transacción

Tiene prioridad sobre el valor de tiempo de espera que establezca en el 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 contexto, que tiene prioridad sobre el tiempo de espera a nivel de 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 contexto 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 puede pasar tiempos de espera de contexto a los siguientes métodos de sesión:

  • AbortTransaction()

  • CommitTransaction()

  • EndSession()

Para obtener más información sobre las transacciones, consulte la Guía de transacciones.

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 se pasa un tiempo de espera de contexto al método Cursor.Next(), este se aplica a cada acción para obtener un documento de resultados. Si se pasa un tiempo de espera de contexto al método Cursor.All(), este se aplica a toda la vida útil del cursor.

Para obtener más información sobre los cursores, consulte la guía Acceder 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