Overview
En esta guía, podrá aprender a 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.
Opción timeout_ms
Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure la opción de conexión timeout_ms con la duración del tiempo de espera en milisegundos. Puede especificar un valor de tiempo de espera de las siguientes maneras:
Pase 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 una de las siguientes pestañas para ver ejemplos de cómo utilizar 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 obsoletas:
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
Al especificar una opción timeout_ms, el controlador aplica el tiempo de espera según los mismos comportamientos de herencia que las demás opciones del controlador Ruby. La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:
Nivel | Descripción de la herencia |
|---|---|
Operación | Toma la máxima prioridad y anula las |
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 anulada 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 de esa colección, a menos que la opción sea anulada por las opciones establecidas en esos niveles. |
Cliente | Se aplica a todas las bases de datos, colecciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen |
Para obtener más información sobre cómo anular la opción de tiempo de espera y configurar otras opciones, consulte lo siguiente Secciónde anulaciones.
Anulaciones
Puede 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 le permite personalizar los tiempos de espera según las necesidades de cada consulta.
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 utilizando 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 especifica default_timeout_ms, el controlador utiliza el valor timeout_ms establecido en el padre Mongo::Client.
No se puede anular el valor timeout_ms de Mongo::Client para una llamada a start_session.
Solo puede establecer un valor de tiempo de espera para el método start_transaction utilizando la timeout_ms opción.
No se puede anular default_timeout_ms configurando la opción timeout_ms en una operación en una sesión de transacción proporcionada por la devolución de llamada with_transaction, o el controlador genera 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 configura timeout_ms tanto en el cliente como directamente en ClientEncryption, el valor proporcionado a ClientEncryption tendrá prioridad.
Cursors
Los cursores ofrecen opciones de tiempo de espera configurables al usar la función CSOT. Puede ajustar el manejo del cursor configurando su duración o el modo de iteración, si es necesario. Para configurar el modo, establezca la opción timeoutMode en cursorLifetime (el valor predeterminado) o en iteration.
Modo de duración del cursor
El modo de duración del cursor usa timeout_ms para limitar la duración total de un cursor. En este modo, la inicialización del cursor y todas las llamadas subsiguientes a sus métodos deben completarse dentro del límite especificado por la opción timeout_ms. Todos los documentos deben devolverse dentro de este límite. De lo contrario, la duración del cursor expira y se produce un error de tiempo de espera.
Cuando cierra un cursor llamando al método to_a o close, el tiempo de espera se restablece para garantizar que se limpien los recursos del lado del servidor.
El siguiente ejemplo muestra cómo configurar la opción timeout_ms para garantizar que el cursor se inicialice y todos los documentos se recuperen en 10 segundos:
docs = collection.find({}, timeout_ms:10000).to_a
Modo de iteración del 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 muestra mediante un cursor iterable y luego obtiene y registra la información 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: