Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Ruby Driver
/

Limitar o tempo de execução do servidor MongoDB

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.

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_ms para o construtor do Mongo::Client.

  • Passe a opção de string de conexão timeoutMS como 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_timeout

  • wait_queue_timeout

  • wtimeout

  • max_time_ms

  • max_commit_time_ms

A opção de conexão timeout_ms tem precedência sobre essas opções de tempo limite obsoletas.

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 timeout_ms definidas em qualquer outro nível.

transação

Tem precedência sobre timeout_ms definido no nível da sessão, coleção, banco de dados ou cliente .

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 timeout_ms.

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.

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

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.

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.

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.

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

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

Para saber mais sobre como usar tempos limite com o driver Ruby, consulte a seguinte documentação da API:

Voltar

Configurar TLS

Próximo

AWS Lambda

Nesta página