Limitar o tempo de execução do servidor MongoDB
Nesta página
Visão geral
Ao usar o driver Node.js para executar uma operação de servidor , você também 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. Quando o tempo limite expira, o driver Node.js gera uma exceção de tempo limite.
Observação
Recurso experimental
O recurso CSOT é experimental e pode mudar em futuras versões de drivers.
Opção timeoutMS
Para especificar um tempo limite ao se conectar a um sistema do MongoDB , defina a opção de conexão timeoutMS
para o comprimento de tempo limite em milissegundos. Você pode fazer isso de duas maneiras: passando um argumento para o construtor MongoClient
ou por meio de um parâmetro em sua string de conexão.
Os seguintes exemplos de código utilizam a opção timeoutMS
para especificar um tempo limite de 30 segundos:
const uri = "mongodb://<hostname:<port>"; const client = new MongoClient(uri, { timeoutMS: 30000 });
const uri = "mongodb://<hostname:<port>?timeoutMS=30000"; const client = new MongoClient(uri);
Observação
A opção de conexão timeoutMS
tem precedência sobre as seguintes opções:
socketTimeoutMS
waitQueueTimeoutMS
wTimeoutMS
maxTimeMS
maxCommitTimeMS
Quando o recurso CSOT não for mais experimental, as opções anteriores serão descontinuadas.
Se você especificar a opção timeoutMS
, o driver aplicará automaticamente o tempo limite especificado para cada operação do servidor . O exemplo de código a seguir especifica um tempo limite de 10 segundos no nível do cliente e, em seguida, chama o método insertOne()
:
const uri = "<connection string uri>"; const client = new MongoClient(uri, { timeoutMS: 10000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); const result = await coll.insertOne({ name: "Yngwie" }); console.log("Insert result:", result); } finally { await client.close(); } } run().catch(console.dir);
Herança de tempo limite
Quando você especifica uma opção timeoutMS
, o driver aplica o tempo limite de acordo com os mesmos comportamentos de herança que as outras opções de driver Node.js 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 substituirá |
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 obter mais informações sobre substituições e opções específicas, consulte a seção Substituições .
Substitui
O driver Node.js oferece suporte a vários níveis de configuração para controlar o comportamento e o desempenho das operações do banco de dados .
Você pode especificar uma opção timeoutMS
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 timeoutMS
pode substituir uma configuração de nível de cliente timeoutMS
:
// Creates a new MongoClient with a client-level timeoutMS configuration const uri = "<connection string uri>"; const client = new MongoClient(uri, { // Client-level timeout: 15 seconds timeoutMS: 15000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); // Performs a query operation with an operation-level timeoutMS configuration const docs = await coll.find({}, // Operation-level timeout: 10 seconds { timeoutMS: 10000 }) .toArray(); console.log(docs); } finally { await client.close(); } } run().catch(console.dir);
Transações
Ao criar uma nova instância ClientSession
para implementar uma transação, use a opção defaultTimeoutMS
. Você pode configurar o defaultTimeoutMS
para especificar os valores de timeoutMS
para utilizar para:
Se você não especificar defaultTimeoutMS
, o driver utilizará o valor de timeoutMS
definido no MongoClient
pai.
Não é possível substituir defaultTimeoutMS
definindo a opção timeoutMS
em uma operação em uma sessão de transação fornecida pela chamada de resposta withTransaction()
. Isso gera 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 timeoutMS
para limitar o tempo permitido para operações de criptografia e descriptografia.
Se você especificar a opção timeoutMS
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 timeoutMS
, a instância herdará a configuração timeoutMS
do MongoClient
usado no construtor ClientEncryption
.
Se você definir timeoutMS
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 timeoutMS
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 timeoutMS
. 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 toArray()
ou close()
, o tempo limite é redefinido para o comando killCursors
para garantir que os recursos do lado do servidor sejam limpos.
O exemplo a seguir mostra como definir a opção timeoutMS
para garantir que o cursor seja inicializado e todos os documentos sejam recuperados dentro de 10 segundos:
const docs = await collection.find({}, {timeoutMS: 10000}).toArray();
Modo de iteração do cursor
O modo de iteração do cursor usa a opção timeoutMS
para limitar cada chamada ao método next()
, hasNext()
ou tryNext()
. O tempo limite é atualizado após a conclusão de cada chamada. Esse é 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 sobre documentos na coleção mflix
usando um cursor com o timeoutMode
definido como iteration
e, em seguida, obtém e registra o imdb_url
para cada documento de filme:
for await (const movie of mflix.find({}, { timeoutMode: 'iteration' })) { const imdbResponse = await fetch(movie.imdb_url); console.log(await imdbResponse.text()); }
Documentação da API
Para saber mais sobre como usar tempos limite com o driver Node.js , consulte a seguinte documentação da API: