Menu Docs

Página inicial do DocsDesenvolver aplicaçõesDrivers PythonPyMongo

Personalizar seleção de servidor MongoDB

Nesta página

  • Visão geral
  • Algoritmo de seleção personalizado
  • Exemplo: Selecionar servidores em localhost
  • Documentação da API

Todos os drivers do MongoDB seguem um algoritmo definido ao selecionar um servidor para ler ou escrever. Ao usar a propriedade server_selector do MongoClient, você pode personalizar este algoritmo para escolher o servidor que funciona melhor para seu aplicativo.

Importante

A personalização do algoritmo de seleção do servidor pode ter consequências não intencionais, como desempenho degradado de leitura ou gravação.

Quando o PyMongo executa uma operação de leitura, ele executa as seguintes etapas, para selecionar um MongoDB :

  1. Na lista de servidores conhecidos, o PyMongo seleciona todos os servidores que correspondem à preferência de leitura ativa.

  2. Se houver pelo menos um servidor legível, o PyMongo chamará a função de seletor de servidor definida pelo usuário e passará a lista da etapa anterior.

  3. O PyMongo aplica a configuração de conexão do localThresholdMS à lista de servidores retornados da função.

  4. O PyMongo seleciona um servidor aleatoriamente dos servidores que ainda estão na lista e executa a operação nesse servidor.

Quando o PyMongo executa uma operação de gravação, ele começa selecionando todos os servidores graváveis, não apenas aqueles que correspondem à preferência de leitura ativa. As etapas restantes são idênticas.

Para saber mais sobre o algoritmo de seleção de servidor padrão, que o driver segue quando você não usa o argumento server_selector, consulte Algoritmo de seleção de servidor MongoDB Server .

Ao utilizar um cluster fragmentado com múltiplos servidores do mongos , você pode querer preferir implantações executadas no localhost. As operações nesses sistemas geralmente têm menor latência e maior taxa de transferência. Este exemplo mostra como personalizar o algoritmo de seleção de servidor para favorecer servidores em execução no localhost.

Primeiro, escreva uma função Python para selecionar seus servidores preferidos. A função de seleção de servidor deve atender aos seguintes critérios:

  • Aceita uma lista de ServerDescription objetos como parâmetro

  • Retorna a lista de objetos ServerDescription adequados para a operação de leitura ou gravação

  • Não cria ou modifica nenhum objeto ServerDescription

O exemplo a seguir define uma função chamada prefer_local que aceita e retorna uma lista de ServerDescription objetos:

def prefer_local(server_descriptions):
...
return servers # list containing preferred servers

Em seguida, implemente sua lógica de seleção de servidor no corpo da função. Você pode utilizar qualquer propriedade definida na classe ServerDescription para selecionar seus servidores preferidos. Para retornar somente implantações do MongoDB em execução no localhost, este exemplo faz um loop nos servidores no server_descriptions e verifica a propriedade address de cada servidor para o valor "localhost":

def prefer_local(server_descriptions):
servers = [
server for server in server_descriptions if server.address[0] == "localhost"
]
return servers

Em seguida, considere o caso em que seu algoritmo não encontra servidores correspondentes. Se a sua função retornar uma lista vazia, seu aplicação não poderá se comunicar com MongoDB. Portanto, retorne uma lista contendo pelo menos um objeto ServerDescription da sua função.

Neste exemplo, se nenhum servidor correspondente for encontrado, a função prefer_local retornará a lista de servidores originalmente passados como um argumento:

def prefer_local(server_descriptions):
servers = [
server for server in server_descriptions if server.address[0] == "localhost"
]
if not servers:
return server_descriptions
return servers

Finalmente, instrua o PyMongo a usar sua função. Para fazer isso, chame o construtor MongoClient e passe o argumento server_selector com seu nome de função como o valor:

client = pymongo.MongoClient("mongodb://<username>:<password>@<hostname>:<port>",
server_selector=prefer_local)

Para obter mais informações sobre como personalizar o algoritmo de seleção de servidor do PyMongo, consulte a seguinte documentação da API:

← Comprimir tráfego de rede