Menu Docs
Página inicial do Docs
/ /

Gerencie conexões com pools de conexões

Neste guia, você aprenderá como o driver Ruby usa pools de conexões para gerenciar conexões com o MongoDB deployment e como definir as configurações de 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 Ruby. Quando seu aplicação solicita uma conexão com o MongoDB, o driver 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 Ruby.

Cada instância do Mongo::Client tem um pool de conexões embutida para cada servidor em sua topologia MongoDB . Se você não configurar a opção min_pool_size, os pools de conexões abrirão conexões 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 Mongo::Client:

Contexto
Descrição

max_pool_size

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. Setting this option to 0 creates an unlimited connection pool.

Default: 100

max_connecting

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

Default: 2

min_pool_size

The minimum number of concurrent connections that the pool maintains.

Default: 0

max_idle_time

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

Default: 0 (no limit)

Além das conexões necessárias para dar suporte às solicitações do seu aplicativo, cada instância Mongo::Client 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 conexões de monitoramento. Se o aplicação usar a configuração padrão para max_pool_size e consultar somente o nó primário (padrão), poderá haver no máximo 106 conexões abertas 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 as conexões de monitoramento abertas.

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

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

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_pool_size: 200
})

Estabelecimento de conexão com limite de taxa de pools de conexões. A opção max_connecting determina o número de conexões que o grupo pode criar em paralelo a qualquer momento. Por exemplo, se o valor de max_connecting 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 max_pool_size conexões no pool.

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

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

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_connecting: 2
})

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

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

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
min_pool_size: 10
})

Observação

Um Mongo::Client configurado com max_idle_time e min_pool_size 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.

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 max_idle_time. Depois que uma conexão fica inativa por max_idle_time, 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 Mongo::Client com um tempo ocioso máximo de 10000 milissegundos (10 segundos), especificando a configuração max_idle_time no objeto options :

require 'mongo'
uri = "<connection-string>"
client = Mongo::Client(uri, {
max_idle_time: 10000
})

Quando qualquer solicitação chama Mongo::Client.close(), o driver Ruby executa as seguintes ações:

  • Fecha todas as conexões ociosas no pool de conexões

  • Fecha todas as conexões que estão em uso à medida que são retornadas ao pool

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

A chamada de Mongo::Client.close() fecha apenas conexões inativas e não encerra diretamente nenhuma operação em andamento.

Observação

O método Mongo::Client.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 conexões e tem a opção timeout_ms definida para 5000 milissegundos.

  • 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 conexão atinge o tempo limite após 5000 milésimos de segundo, o que significa que todas as conexões devem fazer algo durante esses 5000 milésimos de segundo para evitar o fechamento.

Nesse cenário, cada conexão atinge o tempo limite após 5000 milissegundos, 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 todas as conexões ativas, fazendo com que várias delas expirem.

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

Para obter mais informações sobre como criar um objeto Mongo::Client com o driver Ruby e especificar opções, consulte a seção Hash de opções da documentação da API Mongo::Client.

Voltar

Limitar o tempo de execução do servidor MongoDB

Nesta página