Visão geral
Neste guia, você pode aprender como configurar as opções de preocupaçãode 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 Preocupações de leitura/gravação de preocupações 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 start_session() método para obter uma sessão a ser usada para as transações. Em seguida, passe um mongocxx::options::transaction objeto para o with_transaction() método 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 collection:
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 marcações 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 :
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 membros aleatórios do conjunto de réplicas que se enquadram na janela e escolhe o membro 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 mongos instância do, o driver C++ ignora a localThresholdMS opção. 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 membros correspondentes dentro de 35 milissegundos do tempo de ping do membro 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; }
{ "_id": { "$oid" : "1" }, "category": "café" } { "_id": { "$oid" : "2" }, "category": "cafe" } { "_id": { "$oid" : "3" }, "category": "cafE" }
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: