Overview
El driver Go de MongoDB usa la paquete de contexto de la librería estándar de Go, para permitir a las aplicaciones señalar tiempos de espera y cancelaciones en cualquier llamada a métodos bloqueantes. Un método de bloqueo depende de un evento externo, como una entrada o salida de red, para continuar con su tarea.
Un ejemplo de un método bloqueante en el Go Driver es el Insert()
método. Si deseas realizar una operación de inserción en un Collection dentro de 10 segundos, puedes usar un Contexto con un tiempo de espera. Si la operación no se completa dentro del tiempo de espera, el método devuelve un error.
client := mongo.Connect(context.TODO()) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client.Database("<db>").Collection("<collection>").Insert(ctx, bson.D{{"x",1}})
Si el Context (contexto) que se pasa a una operación no tiene plazo, puedes establecer una opción Timeout en tu Client y la operación derivará la especificación del tiempo de espera de esta configuración. Para obtener más información sobre cómo usar la configuración de tiempo de espera único, consulte la Guía de conexión.
Vencimiento
El driver considera que un contexto ha expirado cuando una operación supera el tiempo de espera o se cancela. El driver comprueba la expiración del Context usando el método Done().
Las siguientes secciones describen cuándo y cómo el driver comprueba la expiración.
Selección de servidores
El controlador podría bloquear una llamada a un método si no puede seleccionar un servidor para una operación.
En este escenario, el controlador realiza bucles hasta encontrar un servidor para utilizar en la operación. Después de cada iteración, el controlador devuelve un error de tiempo de espera de selección de servidor si el contexto expiró o si el proceso de selección tardó más que el ajuste serverSelectionTimeoutMS.
Para saber más sobre cómo el driver selecciona un servidor, consulta el Algoritmo de Selección de Servidores.
Checkout de Conexión
El controlador podría bloquear una llamada a un método si no hay conexiones disponibles para revisar.
Tras seleccionar un servidor, el driver intenta obtener una conexión del pool de conexiones del servidor. Si el contexto caduca mientras se verifica una conexión, el método devuelve un error de tiempo de espera.
Establecimiento de conexión
El driver podría bloquear una llamada de método si debe crear una nueva conexión.
Cuando el driver crea una nueva conexión para realizar una operación, el Contexto establece un timeout para el proceso de establecimiento. El driver establece el timeout ya sea para el vencimiento del Contexto o el timeout de conexión, lo que sea más corto.
El siguiente ejemplo configura el tiempo de espera de conexión en 1 segundo y el plazo de Contexto en 2 segundos. Debido a que el tiempo de espera de la conexión es más corto, el proceso de establecimiento caduca después de 1 segundo.
opts := options.Client() opts.SetConnectTimeout(1*time.Second) client := mongo.Connect(context.TODO(), opts) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() client.Database("<db>").Collection("<collection>").InsertOne(ctx, bson.D{{"x",1}})
Lectura y guardado de sockets
Cuando el driver recupera una conexión para una operación, establece el plazo de lectura o guardado del socket en el plazo del Context o el tiempo de espera del socket, el que sea más corto.
Si cancelas el Contexto después de ejecutar el método Read() o Write(), pero antes de que venza el plazo, el comportamiento del driver varía según la versión.
El driver genera una goroutine separada para escuchar la cancelación del Context cuando el método Read() o Write() está en progreso. Si la goroutine detecta una cancelación, cierra la conexión. El método pendiente Read() o Write() devuelve un error que el controlador sobrescribe con el error context.Canceled.
Importante
En las versiones anteriores a la 1.5.0, el driver no detecta la cancelación de Context y espera a que se devuelva el método Read() o Write().