Visão geral
Neste guia, você pode aprender como configurar as opções de preocupação de gravação, preocupação de leitura e preferência de leitura para modificar a maneira como o driver C++ executa operações de leitura e escrita em conjuntos de réplicas.
Precedência de configurações de leitura e gravação
É possível definir as opções de preocupação de gravação, preocupação de leitura e preferência de leitura nos seguintes níveis:
transação
Database
collection
Esta lista também indica a ordem crescente de precedência das configurações de opção. Por exemplo, se você definir um preocupação de leitura para um banco de dados, ele substituirá as configurações de preocupação de leitura herdadas da transação.
Configurar operações de leitura e escrita
Você pode controlar como o driver direciona as operações de leitura definindo uma read preference. Você também pode controlar as opções de como o driver aguarda a confirmação das operações de leitura e gravação em um conjunto de réplicas, definindo uma read concern e uma write concern.
Para saber mais sobre configurações de leitura e escrita e suas opções, consulte os seguintes guias no manual do MongoDB Server :
Para obter informações sobre as configurações padrão de leitura e gravação, consulte Read concerns/write concerns padrão do MongoDB no manual do MongoDB Server.
Configuração da transação
As transações são executadas dentro de sessões, que são agrupamentos de operações de leitura ou escrita relacionadas que você pretende executar sequencialmente. Use o método start_session() para obter uma sessão a ser usada para as transações. Em seguida, passe um objeto mongocxx::options::transaction para o método with_transaction() da sessão. Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma transação.
Dica
Para saber mais sobre sessões, consulte Sessões do servidor no manual do MongoDB Server .
O exemplo define as seguintes configurações:
k_primarypreferência de leitura: as operações de leitura recuperam dados do membro primário do conjunto de réplicas.k_majoritypreocupação de leitura: as operações de leitura retornam os dados mais recentes da instância que foram gravados para a maioria dos membros do conjunto de réplicas.k_acknowledgedpreocupação de gravação: o membro primário do conjunto de réplicas deve confirmar a operação de gravação.
auto session = client.start_session(); mongocxx::options::transaction txn_opts; { mongocxx::read_preference rp; mongocxx::read_concern rc; mongocxx::write_concern wc; rp.mode(mongocxx::read_preference::read_mode::k_primary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); txn_opts.read_preference(rp); txn_opts.read_concern(rc); txn_opts.write_concern(wc); } session.with_transaction([&](mongocxx::client_session*) { // Specify transaction operations here }, txn_opts);
Configuração do Banco de Dados
Este exemplo mostra como definir as seguintes configurações de leitura para seu banco de dados:
k_secondarypreferência de leitura: as operações de leitura recuperam dados somente de nós secundários do conjunto de réplicas.k_majoritypreocupação de leitura: as operações de leitura retornam os dados mais recentes da instância que foram gravados para a maioria dos membros do conjunto de réplicas.
auto db = client["test_database"]; mongocxx::read_preference rp; mongocxx::read_concern rc; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp); db.read_concern(rc);
Configuração da Coleção
Este exemplo mostra como especificar as seguintes configurações de read e preocupação de gravação para sua coleção:
k_localpreocupação de leitura: as operações de leitura retornam os dados mais recentes da instância, sem garantia de que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.k_acknowledgedpreocupação de gravação: o membro primário do conjunto de réplicas deve confirmar a operação de gravação.
auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc; mongocxx::write_concern wc; rc.acknowledge_level(mongocxx::read_concern::level::k_local); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc); coll.write_concern(wc);
Conjuntos de tags
No MongoDB Server, você pode aplicar tags de valor-chave a membros do conjunto de réplicas de acordo com qualquer critério de sua escolha. Você pode então usar essas tags para direcionar um ou mais nós para uma operação de leitura.
Por padrão, o driver C++ ignora as marcações ao escolher um membro para ler. Para instruir o driver C++ a preferir determinadas tags, crie um objeto mongocxx::read_preference e chame sua função de membro tags(). Passe suas tags preferidas como argumento de array para tags().
No exemplo de código a seguir, o conjunto de tags passado para a função tags() instrui o driver C++ a preferir leituras do centro de dados de Nova York ("dc": "ny") e a voltar para o centro de dados de São Francisco ("dc": "sf"):
auto tag_set_ny = make_document(kvp("dc", "ny")); auto tag_set_sf = make_document(kvp("dc", "sf")); mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rp.tags(make_array(tag_set_ny, tag_set_sf).view());
Leituras e gravações retráteis
O driver C++ tenta novamente automaticamente determinadas operações de leitura e gravação uma vez, se elas falharem devido a um erro de rede ou servidor .
Você pode desativar explicitamente as leituras ou gravações repetíveis definindo as opções retryReads ou retryWrites como false em seu URI de conexão. O exemplo a seguir desativa leituras e gravações repetíveis para um cliente:
mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"}; mongocxx::client client{uri};
Para saber mais sobre as operações de leitura e gravação com possibilidade de nova tentativa, consulte os seguintes guias no manual do MongoDB Server :
Observação
Redução de carga no Intelligent Workload Management (IWM)
Se os erros com rótulos SystemOverloadedError ou RetryableError estiverem causando falhas no seu aplicação ou aparecendo nos registros do seu aplicação , a redução de carga pode estar ativa no seu cluster e seu driver pode não estar atualizado para uma versão compatível. Recomendamos atualizar seu driver C++ do MongoDB para a versão 4.3 ou posterior. Se você continuar a ver esses erros após a atualização, poderá resolvê-los por meio de alterações no servidor, como a revisão da configuração do Descarte de carga, ou por meio de alterações no aplicativo, como a implementação de um tratamento personalizado de erros ou a limitação de solicitações do lado do cliente . Dependendo da sua situação, alterações no aplicativo podem ser preferíveis ou necessárias.
O descarte de carga é um recurso do IWM e ajuda a gerenciar a carga do servidor rejeitando operações em excesso durante a sobrecarga sustentada. Este recurso está disponível no MongoDB 9.0 e posterior.
Para obter mais informações sobre IWM ou lidar com erros de sobrecarga, consulte a página Gerenciamento Inteligente de Volume de Trabalho ou a página Erros de Sobrecarga na documentação do Atlas .
Balanceamento de carga
Ao se conectar a um cluster fragmentado ou a um conjunto de réplicas, o driver C++ usa o balanceamento de carga para lidar com solicitações de leitura e gravação. O balanceamento de carga permite que o driver distribua essas solicitações em vários servidores, o que evita sobrecarregar qualquer servidor e garante o desempenho ideal.
Ao se conectar a um cluster fragmentado, o driver C++ determina a instância mais próxima mongos calculando qual delas tem o menor tempo de viagem de ida e volta da rede. Em seguida, o driver determina a janela de latência adicionando o mongos tempo médio de ida e volta deste ao valor localThresholdMS. O driver equilibra as solicitações em até duas mongos instâncias aleatórias que se enquadram na janela de latência. Para cada solicitação, o driver escolhe o servidor com a menor carga de operação determinando seu operationCount valor.
Ao se conectar a um conjunto de réplicas, o driver C++ primeiro seleciona os membros do conjunto de réplicas de acordo com sua preferência de leitura. Em seguida, o driver segue o mesmo processo descrito no número anterior. Após calcular a janela de latência, o driver seleciona até dois nós aleatórios do conjunto de réplicas que se enquadram na janela e escolhe o nó com o menor valor de operationCount para receber a solicitação.
Dica
Para saber mais sobre balanceamento de carga, consulte Sharded Cluster Balancer no manual do MongoDB Server.
LocalThreshold
O driver C++ usa o valor limite local para calcular a janela de latência para seleção do servidor . Este valor determina os servidores elegíveis para receber solicitações de leitura e gravação.
Por padrão, o driver usa apenas mongos instâncias ou membros do conjunto de réplicas cujos tempos de ping estão dentro de 15 milissegundos do servidor mais próximo. Para distribuir leituras entre servidores com latências mais altas, configure o parâmetro localThreshold em seu URI de conexão.
Observação
Ao selecionar membros do conjunto de réplicas a partir de uma única instância do mongos, o driver C++ ignora a opção localThresholdMS. Nesse caso, use a opção de linha de comando localThreshold.
O exemplo a seguir se conecta a um conjunto de réplicas e especifica um limite local de 35 milissegundos:
mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"}; mongocxx::client client{uri};
No exemplo anterior, o driver C++ distribui leituras entre nós correspondentes dentro de 35 milissegundos do tempo de ping do nó mais próximo.
Agrupamentos
Você pode especificar um agrupamentos ao executar operações de leitura e gravar em uma coleção.
Um agrupamento é um conjunto de regras específicas do idioma para comparação de cadeias de caracteres, como para letras maiúsculas e minúsculas e acentos.
Para especificar um agrupamento, passe a definição de agrupamento para o método collation() de um objeto de opções e, em seguida, passe esse objeto de opções para uma operação de leitura ou gravação.
Exemplo de agrupamento
Considere uma coleção com os seguintes documentos:
{ _id: 1, category: "café" }, { _id: 2, category: "cafe" }, { _id: 3, category: "cafE" }
O exemplo a seguir cria um agrupamento que especifica a locale francês e ignora as diferenças entre variantes de maiúsculas e minúsculas. Em seguida, ele usa esse agrupamento para encontrar documentos nos quais o valor de campo category corresponde a "cafe". Devido ao agrupamento especificado, a query retorna todos os três documentos.
mongocxx::options::find opts{}; opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})")); auto cursor = collection.find(make_document(kvp("category", "cafe")), opts); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
Documentação da API
Para saber mais sobre qualquer uma das classes ou métodos discutidos neste guia, consulte a seguinte documentação da API: