Overview
El controlador MongoDB Go utiliza el Paquete de contexto de la biblioteca estándar de Go que permite a las aplicaciones indicar tiempos de espera y cancelaciones para cualquier llamada a un método de bloqueo. 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 de bloqueo en el Go Driver es el Insert()
Método. Si desea realizar una operación de inserción en un Collection en 10 segundos, puede 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 contexto pasado a una operación no tiene fecha límite, puede establecer una opción Timeout en su Client y la operación derivará la especificación de tiempo de espera de esta configuración. Para obtener más información sobre el uso de la configuración de tiempo de espera único, consulte Guía de conexión.
Caducidad
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 controlador verifica la caducidad.
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 verificar.
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 establece el tiempo de espera de la conexión en 1 segundo y la fecha límite del contexto en 2 segundos. Dado que el tiempo de espera de la conexión es menor, el proceso de establecimiento expira 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().