Visão geral
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
Configurar pools de conexões
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 |
---|---|
| 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 |
| The maximum number of connections that each pool can establish
concurrently. |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of milliseconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
| The maximum number of milliseconds that a request can wait for a socket
to become available. Default: 0 (no limit) |
maxPoolSize
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 });
maxConnecting
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 });
minPoolSize
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
.
maxIdleTimeMS
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 });
waitQueueTimeoutMS
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 });
Fechando conexões
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.
Evitar tempos limite de soquete
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.
Documentação da API
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: