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_ms
para o construtor doMongo::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.
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: