Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver de Kotlin Sync
/

Configurar operações CRUD

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 do Kotlin Sync executa operações de leitura e escrita em conjuntos de réplicas.

É 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:

  • Cliente, que define o padrão para todas as execuções de operações, a menos que seja substituído

  • 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 uma preocupação de leitura para uma transação, ela substituirá as configurações de preocupação de leitura herdadas do cliente.

As opções de write concern, preocupação de leitura e preferência de leitura permitem personalizar a consistência causal e a disponibilidade dos dados em seus conjuntos de réplicas. Para ver uma lista completa dessas opções, consulte os seguintes guias no manual do MongoDB Server :

  • readPreference

  • Preocupação de leitura

  • Escreva preocupação

Você pode controlar como o driver roteia as operações de leitura entre os membros do conjunto de réplicas definindo uma preferência de leitura. Você também pode controlar como o driver aguarda a confirmação das operações de leitura e gravação em um conjunto de réplicas definindo preocupações de leitura e gravação.

As seções a seguir mostram como definir essas configurações de leitura e gravação em vários níveis.

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma instância MongoClient passando uma instância MongoClientSettings para o método MongoClient.create(). O código define as seguintes configurações:

  • secondary preferência de leitura: as operações de leitura recuperam dados de nós secundários do conjunto de réplicas.

  • LOCAL preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • W2 preocupação de gravação: o membro primário do conjunto de réplicas e um membro secundário devem confirmar a operação de gravação.

val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.readPreference(ReadPreference.secondary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.W2)
.build()
val mongoClient = MongoClient.create(settings)

Alternativamente, você pode especificar as configurações de leitura e escrita no URI de conexão, que é passado como um parâmetro para o método MongoClient.create():

val uri = "mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local"
val uriClient = MongoClient.create(uri)

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma transação passando uma instância TransactionOptions para o método withTransaction(). 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. Antes de aplicar as opções de transação, utilize o método startSession() para iniciar uma sessã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:

  • primary preferência de leitura: as operações de leitura recuperam dados do membro primário do conjunto de réplicas.

  • MAJORITY preocupaçã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.

  • W1 preocupação de gravação: o membro primário do conjunto de réplicas deve confirmar a operação de gravação.

mongoClient.startSession().use { session ->
try {
// Sets transaction read and write settings
val txnOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.MAJORITY)
.writeConcern(WriteConcern.W1)
.build()
session.withTransaction({
// Specify transaction operations here
}, txnOptions)
} catch (e: Exception) {
println("Transaction failed: ${e.message}")
}
}

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de um banco de dados chamado test_database encadeando métodos de configuração ao método getDatabase(). O código define as seguintes configurações:

  • primaryPreferred preferência de leitura: as operações de leitura recuperam dados do membro primário do conjunto de réplicas ou de membros secundários se o principal não estiver disponível.

  • AVAILABLE preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • MAJORITY preocupação de gravação: A maioria de todos os membros do conjunto de réplicas deve reconhecer a operação de escrita.

val database = mongoClient.getDatabase("test_database")
.withReadPreference(ReadPreference.primaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.MAJORITY)

Este exemplo mostra como definir a preferência de leitura, preocupação de leitura e preocupação de gravação de uma collection chamada test_collection encadeando métodos setter ao método getCollection() . O código define as seguintes configurações:

  • secondaryPreferred preferência de leitura: as operações de leitura recuperam dados de nós secundários do conjunto de réplicas ou dos nós primários se nenhum nó secundário estiver disponível.

  • AVAILABLE preocupação de leitura: as operações de leitura retornam os dados mais recentes da instância sem garantir que os dados tenham sido gravados na maioria dos membros do conjunto de réplicas.

  • UNACKNOWLEDGED preocupação de gravação: os membros do conjunto de réplicas não precisam confirmar a operação de gravação.

val collection = database.getCollection<Document>("test_collection")
.withReadPreference(ReadPreference.secondaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.UNACKNOWLEDGED)

As seções a seguir descrevem maneiras de personalizar ainda mais a forma como o driver Kotlin Sync direciona as operações de leitura.

Você pode especificar uma preferência de leitura ao se conectar a um cluster fragmentado. O MongoDB usa fragmentação para dividir conjuntos de dados por intervalos de chaves e distribuir dados em várias instâncias do banco de dados . Um cluster fragmentado, ou o conjunto de nós em um sistema fragmentado, inclui os seguintes componentes:

  • Fragmento: um conjunto de réplicas que contém um subconjunto dos dados fragmentados.

  • Mongos: um roteador de query que fornece uma interface entre seu aplicação e o cluster fragmentado.

  • Servidores de configuração: servidores que armazenam as definições de configuração e metadados do cluster.

Dica

Para saber mais sobre clusters sharded, consulte Sharding no manual do MongoDB Server.

Ao ler a partir dos shards do conjunto de réplicas, mongos aplica sua preferência de leitura especificada. A preferência de leitura é reavaliada para cada operação.

O exemplo a seguir mostra como se conectar a um cluster fragmentado e especificar uma preferência de leitura secondary em sua string de conexão:

val shardedClient = MongoClient.create(
"mongodb://user:password@mongos1.example.com,mongos2.example.com/?readPreference=secondary"
)

No MongoDB Server, você pode aplicar tags de valor-chave a membros do conjunto de réplicas de acordo com qualquer critério que você escolher. 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 do Kotlin Sync ignora as tags ao escolher um membro para ler. Para instruir o driver Kotlin Sync a preferir determinadas tags, passe as tags como uma lista para seu método de configuração de preferência de leitura .

Suponha que você esteja conectado a um conjunto de réplicas que contém membros hospedados em vários data centers nos Estados Unidos. Você deseja que o driver prefira leituras de nós secundários do conjunto de réplicas na seguinte ordem:

  1. Membros do centro de dados de Nova York, marcados com ("dc", "ny")

  2. Membros do centro de dados de São Francisco, marcados com ("dc", "sf")

  3. Quaisquer membros secundários

Este exemplo de código passa uma lista de tags que representam os membros do conjunto de réplicas anteriores para o método de configuração ReadPreference.secondary(). Em seguida, o código passa as informações de preferência de leitura para o método withReadPreference() para definir a ordem de leitura no banco de dados:

val tag1 = TagSet(Tag("dc", "ny"))
val tag2 = TagSet(Tag("dc", "sf"))
val tag3 = TagSet() // Empty tag set as fallback
val readPref = ReadPreference.secondary(listOf(tag1, tag2, tag3))
val taggedDb = mongoClient.getDatabase("test_database")
.withReadPreference(readPref)

Ao se conectar a um cluster fragmentado ou a um conjunto de réplicas, o driver Kotlin Sync 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 do Kotlin Sync determina a instância mongos mais próxima calculando qual tem o menor tempo de viagem de ida e volta da rede. Em seguida, o driver determina a janela de latência adicionando o tempo médio de ida e volta deste mongos ao valor localThresholdMS. O driver equilibra as solicitações em até duas instâncias aleatórias mongos 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 valor operationCount.

Ao se conectar a um conjunto de réplicas, o driver Kotlin Sync 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.

O driver Kotlin Sync usa o valor do 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, defina a opção localThreshold em uma instância do MongoClientSettings ou a opção localThresholdMS no 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 Kotlin Sync ignora a opção localThresholdMS. Nesse caso, use a opção de linha de comando localThreshold.

O exemplo a seguir conecta a um conjunto de réplica e especifica um limite local de 35 milissegundos. Selecione a aba MongoClientSettings ou Connection URI para ver o código correspondente para cada abordagem:

val latencySettings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.applyToClusterSettings { builder ->
builder.localThreshold(35, TimeUnit.MILLISECONDS)
}
.build()
val latencyClient2 = MongoClient.create(latencySettings)
val latencyClient1 = MongoClient.create(
"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"
)

No exemplo anterior, o driver do Kotlin Sync distribui leituras entre membros correspondentes dentro de 35 milissegundos do tempo de ping do membro mais próximo.

O driver Kotlin Sync tenta novamente automaticamente determinadas operações de leitura e gravação uma única vez se elas falharem devido a um erro de rede ou servidor .

Você pode desabilitar explicitamente as leituras ou gravações repetíveis definindo a opção retryReads ou retryWrites como false em uma instância MongoClientSettings . Você também pode definir as opções retryReads ou retryWrites no URI de conexão.

O exemplo a seguir define leituras e gravações repetíveis como false. Selecione a aba MongoClientSettings ou Connection URI para ver o código correspondente para cada abordagem:

val retrySettings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.retryReads(false) // Disables automatic retries of read operations
.retryWrites(false) // Disables automatic retries of write operations
.build()
val retryClient = MongoClient.create(retrySettings)
val retryUri = "mongodb://localhost:27017/?retryReads=false&retryWrites=false"
val retryUriClient = MongoClient.create(retryUri)

Para saber mais sobre as operações de leitura repetível com suporte, consulte Leituras repetíveis no manual do MongoDB Server . Para saber mais sobre as operações de gravações repetíveis com suporte, consulte Retryable writes no manual do MongoDB Server .

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Transações

Nesta página