Menu Docs
Página inicial do Docs
/ / /
Controlador Node.js
/ /

Limitar o tempo de execução do servidor MongoDB

Nesta página

  • Visão geral
  • Opção timeoutMS
  • Herança de tempo limite
  • Substitui
  • Transações
  • Criptografia do cliente
  • Cursors
  • Modo de vida útil do cursor
  • Modo de iteração do cursor
  • Documentação da API

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.

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);

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á timeoutMS opções definidas em qualquer outro nível.

transação

Tem precedência sobre timeoutMS 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 timeoutMS.

Para obter mais informações sobre substituições e opções específicas, consulte a seção Substituições .

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);

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.

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.

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 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();

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());
}

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

Voltar

Suporte a proxy SOCKS5