Visão geral
Neste guia, você aprenderá a usar a opção timeout_ms para definir um tempo limite para as operações do servidor .
Ao usar o driver Ruby para executar uma operação de servidor , você pode limitar a duração permitida para o servidor concluir a operação. Para fazer isso, especifique um tempo limite de operação do lado do cliente (CSOT). O tempo limite se aplica a todas as etapas necessárias para concluir a operação, incluindo seleção do servidor , verificação da conexão e execução do lado do servidor. Se o tempo limite expirar antes da conclusão da operação, o driver Ruby emitirá uma exceção de tempo limite.
Opção timeout_ms
Para especificar um tempo limite ao se conectar a um sistema MongoDB , defina a opção de conexão timeout_ms para o comprimento de tempo limite em milissegundos. Você pode especificar um valor de tempo limite das seguintes maneiras:
Passe a opção do cliente
timeout_mspara o construtor doMongo::Client.Passe a opção de string de conexão
timeoutMScomo parâmetro para sua string de conexão.
Selecione a partir das seguintes guias para visualizar exemplos de como usar a opção do cliente timeout_ms ou a opção de string de conexão do timeoutMS para especificar um tempo limite 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)
Se você especificar a opção timeout_ms, o driver aplicará automaticamente o tempo limite especificado para cada operação do servidor .
Observação
A opção de conexão timeout_ms unifica a maioria das opções relacionadas ao tempo limite. As seguintes opções de tempo limite são preteridas:
socket_timeoutwait_queue_timeoutwtimeoutmax_time_msmax_commit_time_ms
A opção de conexão timeout_ms tem precedência sobre essas opções de tempo limite obsoletas.
Herança de tempo limite
Quando você especifica uma opção timeout_ms, o driver aplica o tempo limite de acordo com os mesmos comportamentos de herança que as outras opções de driver Ruby. A tabela a seguir descreve como o valor do tempo limite é herdado em cada nível:
Nível | Descrição da herança |
|---|---|
(operação) | Tem a maior precedência e substitui as opções de |
transação | Tem precedência sobre |
Sessão | Aplica-se a todas as transações e operações dentro dessa sessão, a menos que a opção seja substituída por opções definidas nesses níveis. |
Database | Aplica-se a todas as sessões e operações desse banco de dados, a menos que a opção seja substituída pelas opções definidas nesses níveis. |
collection | Aplica-se a todas as sessões e operações dessa collection, a menos que a opção seja substituída por opções definidas nesses níveis. |
Cliente | Aplica-se a todos os bancos de dados, collections, sessões, transações e operações dentro desse cliente que não especificam de outra forma |
Para saber mais sobre como substituir a opção de tempo limite e definir outras opções, consulte a seção Substituições a seguir.
Substitui
Você pode especificar uma opção timeout_ms no nível de operação para substituir a configuração do cliente para uma operação específica. Isso permite que você personalize os tempos limite com base nas necessidades de queries individuais.
O exemplo seguinte demonstra como uma configuração de nível de operação timeout_ms pode substituir uma configuração de nível 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
Transações
Você pode definir um tempo limite para transações usando a opção default_timeout_ms do cliente .
Ao criar uma nova instância Mongo::Session para implementar uma transação, você pode definir a opção default_timeout_ms do cliente para especificar os valores timeout_ms para os seguintes métodos:
Se você não especificar default_timeout_ms, o driver utilizará o valor de timeout_ms definido no Mongo::Client pai.
Você não pode substituir o valor timeout_ms do Mongo::Client para uma chamada para start_session.
Você só pode definir um valor de tempo limite para o método start_transaction usando a opção timeout_ms.
Você não pode substituir default_timeout_ms definindo a opção timeout_ms em uma operação em uma sessão de transação fornecida pela chamada de resposta with_transaction , ou o driver lançará um erro.
Criptografia do cliente
Quando você usa a criptografia no nível do campo do lado do cliente (CSFLE), o driver usa a opção timeout_ms para limitar o tempo permitido para operações de criptografia e descriptografia.
Se você especificar a opção timeout_ms ao construir uma instância do ClientEncryption, ela controlará o tempo de vida de todas as operações executadas nesta instância. Se você não fornecer timeout_ms, a instância herdará a configuração timeout_ms do Mongo::Client usado no construtor ClientEncryption.
Se você definir timeout_ms no cliente e diretamente em ClientEncryption, o valor fornecido para ClientEncryption terá precedência.
Cursors
Os cursores oferecem configurações de tempo limite configuráveis ao usar a funcionalidade CSOT. Você pode ajustar o manuseio do cursor configurando a vida útil do cursor ou o modo de iteração do cursor, se necessário. Para configurar o modo timeoutMode, defina a opção cursorLifetime, que é o padrão, ou iteration.
Modo de vida útil do cursor
O modo de vida útil do cursor usa timeout_ms para limitar toda a vida útil de um cursor. Neste modo, a inicialização do cursor e todas as chamadas subsequentes para os métodos do cursor devem ser concluídas dentro do limite especificado pela opção timeout_ms. Todos os documentos devem ser devolvidos dentro desse limite. Caso contrário, a vida útil do cursor expira e ocorre um erro de tempo limite.
Quando você fecha um cursor chamando o método to_a ou close, o tempo limite é redefinido para garantir que os recursos do lado do servidor sejam limpos.
O exemplo a seguir mostra como definir a opção timeout_ms para garantir que o cursor seja inicializado e todos os documentos sejam recuperados dentro de 10 segundos:
docs = collection.find({}, timeout_ms:10000).to_a
Modo de iteração do cursor
O modo de iteração do cursor utiliza a opção timeout_ms para limitar cada chamada ao método try_next. O tempo limite é atualizado após a conclusão de cada chamada. Este é o modo padrão para todos os cursores tailable, como os cursores tailable retornados pelo método find em capped collections ou change streams.
O exemplo de código a seguir itera documentos em uma collection de amostras usando um cursor iterável e, em seguida, obtém e registra as informações title para cada documento de filme:
cursor = collection.find() cursor.each do |movie| puts movie['title'] end
Documentação da API
Para saber mais sobre como usar tempos limite com o driver Ruby, consulte a seguinte documentação da API: