Overview
En esta guía, puedes aprender cómo utilizar el timeout_ms opción para establecer un tiempo de espera para las operaciones del servidor.
Al usar el controlador Ruby para realizar una operación de servidor, puede limitar el tiempo que el servidor tarda en finalizarla. Para ello, especifique un tiempo de espera de operación del lado del cliente (CSOT). Este 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. Si el tiempo de espera expira antes de que se complete la operación, el controlador Ruby genera una excepción de tiempo de espera.
timeout_ms Opción
Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, establezca la opción de conexión timeout_ms en la duración del tiempo de espera en milisegundos. Puedes especificar un valor de tiempo de espera de las siguientes maneras:
Pasa la opción de cliente
timeout_msal constructorMongo::Client.Pase la opción de cadena de conexión
timeoutMScomo parámetro a su cadena de conexión.
Seleccione de las siguientes pestañas para ver ejemplos de cómo usar la opción de cliente timeout_ms o la opción de cadena de conexión timeoutMS para especificar un tiempo de espera de 30 segundos:
uri = "<connection string>" options = { timeout_ms: 30000 } client = Mongo::Client.new(uri, options)
uri = "mongodb://<hostname>:<port>?timeoutMS=30000" client = Mongo::Client.new(uri)
Si especifica la opción timeout_ms, el controlador aplica automáticamente el tiempo de espera especificado para cada operación del servidor.
Nota
La opción de conexión timeout_ms unifica la mayoría de las opciones relacionadas con el tiempo de espera. Las siguientes opciones de tiempo de espera están en desuso:
socket_timeoutwait_queue_timeoutwtimeoutmax_time_msmax_commit_time_ms
La opción de conexión timeout_ms tiene prioridad sobre estas opciones de tiempo de espera obsoletas.
Herencia de tiempo de espera
Cuando se especifica una opción timeout_ms, el controlador aplica el tiempo de espera de acuerdo con los mismos comportamientos de herencia que las otras opciones del controlador de Ruby. 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 precedencia y anula las opciones |
transacción | Tiene prioridad sobre |
sesión | Se aplica a todas las transacciones y operaciones dentro de esa sesión, a menos que la opción sea sobrescrita por las opciones establecidas en esos niveles. |
Database | Se aplica a todas las sesiones y operaciones dentro de esa base de datos, a menos que la opción sea anulada por las opciones establecidas en esos niveles. |
Colección | Se aplica a todas las sesiones y operaciones en esa colección, a menos que la opción se anule mediante opciones establecidas en esos niveles. |
Cliente | Se aplica a todas las bases de datos, recopilaciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen de otra manera |
Para obtener más información sobre cómo anular la opción de tiempo de espera y establecer otras opciones, consulte lo siguiente: Sección Substituciones.
Anulaciones
Puedes especificar una opción timeout_ms a nivel de operación para anular la configuración a nivel de cliente para una operación específica. Esto te permite personalizar los tiempos de espera según las necesidades de cada query individual.
El siguiente ejemplo demuestra cómo una configuración de nivel de operación timeout_ms puede anular una configuración de nivel de cliente timeout_ms:
require 'mongo' # Replace the placeholder with your connection string uri = "<connection string>" # Sets a client-level timeout configuration options = { timeout_ms: 30000 } Mongo::Client.new(uri, options) do |client| db = client.use('test-db') collection = db[:test-collection] # Performs a query with an operation-level timeout configuration, # overriding the client-level configuration docs = collection.find({}, timeout_ms: 10000).to_a docs.each { |doc| puts doc } end
Transacciones
Puede establecer un tiempo de espera para las transacciones usando la opción de cliente default_timeout_ms.
Cuando crea una nueva instancia Mongo::Session para implementar una transacción, puede configurar la opción de cliente default_timeout_ms para especificar los valores timeout_ms para los siguientes métodos:
Si no se especifica default_timeout_ms, el controlador utiliza el valor timeout_ms establecido en el elemento padre Mongo::Client.
No puedes anular el valor timeout_ms de Mongo::Client para una llamada a start_session.
Solo se puede establecer un valor de tiempo de espera para el método start_transaction usando la opción timeout_ms.
No se puede sobrescribir default_timeout_ms estableciendo la opción timeout_ms en una operación en una sesión de transacción proporcionada por la función de retorno with_transaction, o el driver lanzará un error.
Cifrado del cliente
Cuando se utiliza el cifrado a nivel de campo del lado del cliente (CSFLE), el controlador utiliza la opción timeout_ms para limitar el tiempo permitido para las operaciones de cifrado y descifrado.
Si especifica la opción timeout_ms al construir una instancia ClientEncryption, esta controla la duración de todas las operaciones realizadas en ella. Si no proporciona timeout_ms, la instancia hereda la configuración timeout_ms de la opción Mongo::Client utilizada en el constructor ClientEncryption.
Si configuras timeout_ms en el cliente y directamente en ClientEncryption, el valor proporcionado a ClientEncryption tiene prioridad.
Cursors
Los cursores ofrecen ajustes configurables de tiempo de espera a utilizar la funcionalidad CSOT. Puedes ajustar el manejo del cursor configurando el tiempo de vida del cursor o el modo de iteración del cursor si es necesario. Para configurar el modo, establece la opción timeoutMode en cursorLifetime, que es por defecto, o iteration.
Modo de tiempo de vida del cursor
El modo de duración del cursor utiliza timeout_ms para limitar toda la vida útil de un cursor. En este modo, la inicialización del cursor y todas las llamadas posteriores a los métodos del cursor deben completarse dentro del límite especificado por la opción timeout_ms. Todos los documentos deben ser devueltos dentro de este plazo. De lo contrario, el período de vida del cursor expira y ocurre un error de tiempo de espera.
Cuando cierras un cursor llamando al método to_a o close, el tiempo de espera se restablece para garantizar que los recursos del servidor sean limpiados.
El siguiente ejemplo muestra cómo configurar la opción timeout_ms para garantizar que el cursor esté inicializado y que todos los documentos se recuperen dentro de 10 segundos:
docs = collection.find({}, timeout_ms:10000).to_a
Modo de iteración de cursor
El modo de iteración del cursor utiliza la opción timeout_ms para limitar cada llamada al método try_next. El tiempo de espera se actualiza tras cada llamada. Este es el modo predeterminado para todos los cursores adaptables, como los cursores adaptables devueltos por el método find en colecciones limitadas o flujos de cambios.
El siguiente ejemplo de código itera sobre los documentos de una colección de ejemplo utilizando un cursor iterable, luego recupera y registra la información de title para cada documento de película:
cursor = collection.find() cursor.each do |movie| puts movie['title'] end
Documentación de la API
Para obtener más información sobre el uso de tiempos de espera con el controlador Ruby, consulte la siguiente documentación de API: