Visão geral
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::Predicatepara 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.
Algoritmo de seleção personalizado
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 :
Escolher servidores qualificados: na lista de servidores conhecidos, o driver seleciona servidores que
SelectionCriteriacorrespondam ao ativo, aqueles que correspondem a uma preferência de leitura ou aqueles para os quais um predicado personalizadotrueretorna.Aplicar janela de latência: o driver aplica a
local_thresholdconfiguraçã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.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 .
Critérios de seleção e predicados
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 oReadPreferencenã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.
Exemplo: Usar Predicados para Selecionar Servidores no Localhost
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.
Escrever uma função de predicado
A função do predicado deve atender aos seguintes critérios:
Aceita uma referência a um objeto
ServerInfocomo parâmetroRetorna 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" ) });
Lidar com o caso quando nenhum servidor corresponder
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.
Use seu predicado nas opções de conexão
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)?;
Documentação da API
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: