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
/ / /
Controlador Node.js
/ /

Gerencie conexões com pools de conexões

Neste guia, você aprenderá como o driver do Node.js usa pools de conexões para gerenciar conexões com uma MongoDB deployment e como definir as configurações do pool de conexões em seu aplicação.

Um pool de conexões é um cache de conexões de banco de dados abertas mantidas pelo driver Node.js Quando seu aplicação solicita uma conexão com o MongoDB, o driver do Node.js obtém uma conexão do pool sem problemas, executa operações e retorna a conexão ao pool para reutilização.

Os pools de conexões ajudam a reduzir a latência de aplicação e o número de vezes que novas conexões são criadas pelo driver Node.js

Cada instância do MongoClient tem um pool de conexões embutida para cada servidor em sua topologia MongoDB . Se você não configurar a opção minPoolSize, os pools de conexão abrirão soquetes sob demanda para oferecer suporte a solicitações simultâneas ao MongoDB em seu aplicação.

Você pode especificar as seguintes configurações do pool de conexões na sua instância do MongoClient:

Contexto
Descrição

maxPoolSize

The maximum number of concurrent connections that the pool maintains. If the number of in-use connections to a server reaches the specified value, the next request to that server waits until a connection becomes available.

Default: 100

maxConnecting

The maximum number of connections that each pool can establish concurrently.

minPoolSize

The minimum number of concurrent connections that the pool maintains.

Default: 0

maxIdleTimeMS

The maximum number of milliseconds that a connection can remain idle in the pool.

Default: 0 (no limit)

waitQueueTimeoutMS

The maximum number of milliseconds that a request can wait for a socket to become available.

Default: 0 (no limit)

Além dos soquetes necessários para dar suporte às solicitações do seu aplicativo, cada instância MongoClient abre até duas conexões por servidor em sua topologia MongoDB para monitorar o estado do servidor.

Por exemplo, um cliente conectado a um conjunto de réplicas de três nós abre seis soquetes de monitoramento. Se o aplicação usar a configuração padrão para maxPoolSize e consultar apenas o nó primário (padrão), poderá haver no máximo 106 soquetes abertos e 100 conexões no pool de conexões. Se o aplicação usar uma preferência de leitura para consultar os nós secundários, essas pools de conexões crescerão e poderá haver um total de 306 conexões, incluindo os soquetes de monitoramento abertos.

Para dar suporte a um grande número de solicitações simultâneas do MongoDB em um processo, você pode aumentar maxPoolSize.

O seguinte código cria uma instância do MongoClient com um tamanho máximo do pool de conexões de 200 especificando a opção maxPoolSize no objeto options :

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxPoolSize: 200
});

Estabelecimento de conexão com limite de taxa de pools de conexões. A opção maxConnecting determina o número de conexões que o grupo pode criar em paralelo a qualquer momento. Por exemplo, se o valor de maxConnecting for 2, a terceira solicitação que tenta fazer check-out simultâneo de uma conexão terá êxito somente quando ocorrer um dos seguintes casos:

  • O pool de conexões termina de criar uma conexão e há menos de maxPoolSize conexões no pool.

  • Uma conexão existente é verificada novamente no pool.

O código a seguir cria uma instância MongoClient com um número máximo de conexões 2 a serem estabelecidas simultaneamente por pool, especificando a opção maxConnecting no objeto options :

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxConnecting: 2
});

Você pode configurar o número mínimo de conexões para cada servidor com a opção minPoolSize. O driver garante que sempre haja pelo menos o número de conexões definidas pela opção minPoolSize no pool de conexões. Se os soquetes forem fechados, fazendo com que o número total de soquetes (em uso e ociosos) caia abaixo do mínimo, mais soquetes serão abertos até que o mínimo seja atingido.

O seguinte código cria uma instância do MongoClient com um tamanho mínimo do pool de conexão de 10 especificando a opção minPoolSize no objeto options :

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
minPoolSize: 10
});

Observação

Um MongoClient configurado com maxIdleTimeMS e minPoolSize definido como 0 é ideal para volumes de trabalho com períodos sustentados de baixa atividade. Essa configuração permite que o pool de conexões feche conexões não utilizadas durante períodos de inatividade.

Nas versões anteriores à 6.18.0, o driver Node.js não fechava conexões ociosas quando minPoolSize era definido como 0 durante períodos de inatividade. A partir da versão 6.18.0, o pool de conexões fecha corretamente as conexões ociosas, independentemente da configuração minPoolSize.

Você pode definir o número máximo de milésimos de segundo em que uma conexão pode permanecer ociosa no pool definindo a opção maxIdleTimeMS. Depois que uma conexão fica inativa por maxIdleTimeMS, o pool de conexões a remove e a substitui. O padrão desta opção é 0 (sem limite).

O código a seguir cria uma instância MongoClient com um tempo ocioso máximo de 10000 milissegundos (10 segundos), especificando a configuração maxIdleTimeMS no objeto options :

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxIdleTimeMS: 10000
});

MongoClient suporta várias solicitações simultâneas. Para cada processo, crie um cliente e reutilize-o para todas as operações de um processo. Essa prática é mais eficiente do que criar um cliente para cada solicitação.

O driver não limita o número de solicitações que podem aguardar a disponibilidade de soquetes, e é responsabilidade do aplicativo limitar o tamanho de seu pool para limitar o enfileiramento durante um pico de carga. Os pedidos aguardam a quantidade de tempo especificada na opção waitQueueTimeoutMS, que padroniza para 0 (sem limite).

Uma solicitação que aguarda mais do que o período de tempo definido por waitQueueTimeoutMS para um soquete gera um erro de conexão. Use essa opção se for mais importante limitar a duração das operações durante um pico de carga do que concluir cada operação.

O seguinte código cria uma instância MongoClient com um tempo limite máximo da fila de espera de 10000 milésimos de segundo (10 segundos), declarando-o no objeto options :

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
waitQueueTimeoutMS: 10000
});

Quando qualquer solicitação chama MongoClient.close(), o driver Node.js executa as seguintes ações:

  • Fecha todos os soquetes ociosos no pool de conexões

  • Fecha todos os soquetes que estão em uso à medida que são retornados ao pool

  • Fecha todos os soquetes que estão em uso somente quando as operações associadas são concluídas

A chamada de MongoClient.close() fecha somente os soquetes inativos e não encerra diretamente nenhuma operação em andamento.

Observação

O método MongoClient.close() fecha sessões e transações existentes, o que pode afetar indiretamente o comportamento de operações em andamento e abrir cursores.

Ter um grande pool de conexões nem sempre reduz as solicitações de reconexão. Considere o seguinte cenário de exemplo :

  • Um aplicação tem um tamanho de pool de conexões de 5 soquetes e tem a opção socketTimeoutMS definida para 5000 milésimos de segundo.

  • As operações ocorrem, em média, a cada 3000 milésimos de segundo, e as solicitações de reconexão são frequentes.

  • Cada soquete atinge o tempo limite após 5000 milésimos de segundo, o que significa que todos os soquetes devem fazer algo durante esses 5000 milésimos de segundo para evitar o fechamento.

Nesse cenário, cada soquete atinge o tempo limite após 5000 milésimos de segundo, exigindo atividade dentro desse período de tempo limite para evitar o fechamento. No entanto, uma mensagem a cada 3000 milésimos de segundo não é suficiente para manter todos os soquetes ativos, fazendo com que vários deles expirem.

Para evitar tempos limite excessivos de soquete, reduza o número de conexões que o driver pode manter no pool de conexões especificando a opção maxPoolSize. Para saber como definir a opção maxPoolSize, consulte a seção maxPoolSize.

Para obter mais informações sobre como criar um objeto MongoClient com o driver Node.js e especificar opções, consulte a seguinte documentação da API:

Voltar

Limitar o tempo de execução do servidor MongoDB

Nesta página