Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /

Personalizar seleção de servidor MongoDB

Todos os drivers do MongoDB seguem um algoritmo definido ao selecionar um servidor para ler ou escrever. O MongoDB Rust Driver permite que você personalize esse algoritmo para escolher um servidor que funcione melhor para seu aplicação.

Você pode influenciar a seleção do servidor das seguintes maneiras:

  • Use uma preferência de leitura para descrever servidores adequados de forma padronizada, como primário, secundário ou mais próximo com conjuntos de tags e desatualização máxima.

  • Forneça um predicado personalizado via SelectionCriteria::Predicate para aplicar sua própria lógica ao filtrar servidores adequados.

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 driver Rust executa uma operação com critérios de seleção personalizados, ele executa as seguintes etapas, em ordem, para selecionar uma deployment do MongoDB :

  1. Escolher servidores qualificados: na lista de servidores conhecidos, o driver seleciona servidores que SelectionCriteria correspondam ao ativo, aqueles que correspondem a uma preferência de leitura ou aqueles para os quais um predicado personalizado true retorna.

  2. Aplicar janela de latência: o driver aplica a local_threshold configuração à lista de servidores qualificados, filtrando qualquer servidor cujo tempo médio de ida e volta esteja fora da janela configurada do servidor qualificado mais rápido.

  3. Seleção aleatória: o condutor seleciona aleatoriamente um servidor dos restantes na janela de latência e executa a operação neste servidor.

Quando o driver Rust 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, consulte Algoritmo de seleção de servidor no manual do MongoDB Server .

O driver Rust representa regras de seleção de servidor com o enumeração SelectionCriteria , conforme mostrado no exemplo a seguir:

pub enum SelectionCriteria {
ReadPreference(ReadPreference),
Predicate(Predicate),
}

Para qualquer operação, você usa SelectionCriteria::ReadPreference ou SelectionCriteria::Predicate, não ambos:

  • ReadPreference: descreve servidores adequados com base no tipo de servidor , conjuntos de tags e desatualização máxima, seguindo as regras de preferência de leitura padrão do MongoDB .

  • Predicate: permite que você forneça lógica personalizada para casos que o ReadPreference não consegue expressar, como preferir servidores com base em padrões de nome de host ou outros critérios personalizados.

Um predicado é qualquer fechamento que aceite uma referência ServerInfo e retorne true, indicando a compatibilidade do servidor . O driver define isso como o alias de tipo Predicate, mostrado no seguinte código:

pub type Predicate = Arc<dyn Send + Sync + Fn(&ServerInfo) -> bool>;

Um servidor é considerado adequado quando seu predicado retorna true para o valor ServerInfo desse servidor. O tipo ServerInfo expõe informações sobre o servidor , como endereço, tipo e outros metadados de monitoramento.

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

A função do predicado deve atender aos seguintes critérios:

  • Aceita uma referência a um objeto ServerInfo como parâmetro

  • Retorna um booleano indicando se o servidor é adequado para seleção

  • Não cria ou modifica nenhum objeto ServerInfo

O exemplo seguinte define um predicado que prefere servidores cujo endereço de host é localhost:

let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});

Se o seu predicado retornar false para cada servidor disponível, o driver não poderá selecionar um servidor. Nesse caso, a operação falha e retorna um erro de tempo limite de seleção do servidor indicando que nenhum dos servidores disponíveis é adequado para os critérios especificados.

Para evitar esse resultado, certifique-se de que seu predicado corresponda a pelo menos um servidor em condições normais ou lide com erros de seleção de servidor no código do aplicação e tente novamente com um SelectionCriteria menos restritivo, se necessário.

Para usar seu predicado para seleção do servidor , passe para a opção selection_criteria ao criar o cliente. Selecione a aba :guilabel:Asynchronous ou :guilabel:Synchronous para ver o código correspondente para cada tempo de execução:

let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});
let options = ClientOptions::builder()
.hosts(vec![ServerAddress::Tcp {
host: "<hostname>".to_string(),
port: Some(27017),
}])
.selection_criteria(SelectionCriteria::Predicate(prefer_localhost))
.build();
let client = Client::with_options(options)?;
let mut options = ClientOptions::parse(
"mongodb://<db_username>:<db_password>@<hostname>:<port>",
)
.await?;
let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});
options.selection_criteria = Some(
SelectionCriteria::Predicate(prefer_localhost),
);
let client = Client::with_options(options)?;

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

Voltar

Comprimir tráfego de rede

Nesta página