Personalizar seleção de servidor MongoDB
Nesta página
Visão geral
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.
Algoritmo de seleção personalizado
Quando o PyMongo executa uma operação de leitura, ele executa as seguintes etapas, para selecionar um MongoDB :
Na lista de servidores conhecidos, o PyMongo seleciona todos os servidores que correspondem à preferência de leitura ativa.
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.
O PyMongo aplica a configuração de conexão do
localThresholdMS
à lista de servidores retornados da função.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 no manual do MongoDB Server .
Exemplo: Selecionar servidores em localhost
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âmetroRetorna a lista de objetos
ServerDescription
adequados para a operação de leitura ou gravaçãoNã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://<db_username>:<db_password>@<hostname>:<port>", server_selector=prefer_local)
Documentação da API
Para obter mais informações sobre como personalizar o algoritmo de seleção de servidor do PyMongo, consulte a seguinte documentação da API: