Overview
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.
Opción timeoutMS
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 instanciaClientConfiguración del parámetro
timeoutMSen 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.
Valores de tiempo de espera aceptados
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. |
| Especifica que las operaciones nunca expiran. |
| 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.
Herencia de tiempo de espera
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.
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"}})
Transacciones
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.
Cursors
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.
Documentación de la API
Para obtener más información sobre el uso de tiempos de espera con el controlador Go, consulte la siguiente documentación de API: