MongoDB Academy · Aula

Preferências de leitura: distribuindo a carga de leitura

Você configurará preferências de leitura primary, primaryPreferred, secondary, nearest e com rótulos para encaminhar leituras pelo conjunto de réplicas.

Aula 4 de 413 etapas

Preferências de leitura: distribuindo a carga de leitura é uma aula grátis de MongoDB Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de MongoDB Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de MongoDB Academy inclui 4 aulas no total.

O que é uma preferência de leitura?

Uma preferência de leitura controla para qual membro do conjunto de réplicas o controlador envia as operações de leitura. Por padrão, todas as leituras vão para o primário para garantir que você sempre veja os dados mais recentes. No entanto, redirecionar as leituras para secundários pode reduzir a carga no primário e aproximar geograficamente as leituras dos usuários, ao custo de possivelmente ler dados ligeiramente desatualizados.

primary: sempre ler do primário

primary (o padrão) direciona todas as leituras para o primário. Isso garante consistência forte — você sempre lerá suas próprias gravações e verá os dados mais atualizados. A desvantagem é que o primário processa todo o tráfego de leitura e gravação. Use este modo sempre que dados desatualizados forem inaceitáveis, como em aplicações financeiras ou painéis voltados aos usuários.

// Explicit primary read preference (this is the default)
const col = db.collection('accounts', {
  readPreference: 'primary'
})
await col.findOne({ _id: userId })

primaryPreferred: fallback para o secundário

primaryPreferred lê do primário quando ele está disponível, mas usa um secundário como fallback se o primário estiver inacessível. Isso proporciona um equilíbrio: normalmente, você obtém dados recentes, mas a aplicação continua funcionando de forma adequada durante as eleições do primário. Tenha em mente que, durante o fallback, você pode ler dados alguns segundos atrasados.

const col = db.collection('products', {
  readPreference: 'primaryPreferred'
})
await col.find({}).toArray()

secondary: ler somente dos secundários

secondary envia todas as leituras para os secundários disponíveis, sem nunca acessar o primário. É ideal para consultas analíticas, tarefas em lote ou relatórios que tolerem consistência eventual. Isso reduz significativamente a pressão de leitura sobre o primário. Se nenhum secundário estiver disponível, a operação falhará — ela NOT usará o primário como fallback.

// Route analytics query to secondary
const col = db.collection('events', {
  readPreference: 'secondary'
})
const count = await col.countDocuments({ type: 'click' })

secondaryPreferred: secundário com fallback

secondaryPreferred prefere os secundários, mas usa o primário como fallback se nenhum secundário estiver disponível. Esse é o modo não padrão mais usado — ele distribui a carga de leitura entre os secundários em condições normais, mantendo a disponibilidade quando um secundário fica indisponível. A ressalva é a mesma de secondary: as leituras podem estar ligeiramente desatualizadas.

const col = db.collection('catalog', {
  readPreference: 'secondaryPreferred'
})
await col.find({ category: 'books' }).toArray()

nearest: menor latência de rede

nearest envia as leituras para o membro com o menor tempo de ida e volta medido na rede, independentemente de ele ser primário ou secundário. Isso é ideal para aplicações distribuídas globalmente, nas quais usuários de diferentes regiões devem ler do centro de dados mais próximo. Observe que usuários diferentes podem ler de membros diferentes e, portanto, podem ver temporariamente estados diferentes dos dados.

const col = db.collection('content', {
  readPreference: 'nearest'
})
await col.findOne({ slug: 'hello-world' })

Conjuntos de rótulos: direcionando para membros específicos

Conjuntos de rótulos permitem rotular membros do conjunto de réplicas (por exemplo, { region: 'us-east' }, { purpose: 'analytics' }) e, em seguida, definir preferências de leitura que direcionem as operações apenas para os membros correspondentes. Isso permite um roteamento sofisticado: enviar as leituras da aplicação para a região mais próxima e as consultas analíticas para um secundário dedicado, tudo dentro do mesmo conjunto de réplicas.

// Tag a member in replica set config
let cfg = rs.conf()
cfg.members[2].tags = { region: 'eu-west', purpose: 'analytics' }
rs.reconfig(cfg)

// Read from eu-west analytics member
const col = db.collection('reports', {
  readPreference: new ReadPreference('secondary', [{ region: 'eu-west' }])
})

Leituras desatualizadas e atraso na replicação

Ao ler de secundários, você pode encontrar leituras desatualizadas — o secundário ainda não replicou as gravações mais recentes do primário. A desatualização depende do atraso na replicação. O MongoDB 3.6 introduziu maxStalenessSeconds: o controlador se recusa a usar um secundário cujo atraso seja superior ao número de segundos especificado, evitando leituras muito desatualizadas.

// Reject secondaries more than 90 seconds behind
const col = db.collection('products', {
  readPreference: new ReadPreference(
    'secondaryPreferred',
    [],
    { maxStalenessSeconds: 90 }
  )
})

Preferência de leitura na cadeia de conexão

Você pode definir a preferência de leitura padrão para todas as operações na cadeia de conexão usando o parâmetro readPreference. Essa é a maneira mais fácil de configurar o padrão sem alterar cada ponto de chamada. As operações individuais ainda podem substituí-la transmitindo explicitamente uma opção readPreference.

// Connection string with secondaryPreferred default
const uri = 'mongodb+srv://host/db?readPreference=secondaryPreferred&maxStalenessSeconds=120'
const client = new MongoClient(uri)

Preferência de leitura e transações

As transações com vários documentos devem sempre usar a preferência de leitura primary. As operações dentro de uma transação que especificarem uma preferência de leitura diferente lançarão um erro. Isso garante que todas as leituras dentro da mesma transação vejam um instantâneo consistente correspondente ao momento de início da transação no primário.

// Inside a transaction, reads always go to primary
const session = client.startSession()
await session.withTransaction(async () => {
  // This implicitly uses primary read preference
  const order = await db.orders.findOne({ _id: orderId }, { session })
  await db.inventory.updateOne({ sku: order.sku }, { $inc: { qty: -1 } }, { session })
})

Escolhendo a preferência de leitura na prática

Use este guia: Dados de usuários em tempo real (carrinho, perfil, notificações) → primary. Catálogo de produtos, conteúdo → secondaryPreferred. Relatórios e análises → secondary com um membro analítico dedicado. Leituras globais semelhantes às de uma CDN → nearest. Sempre meça o atraso na replicação antes de direcionar leituras críticas para secundários.

Verificação rápida

Teste sua compreensão dos conceitos de MongoDB e bancos de dados NoSQL desta lição.

Resumo da lição

Nesta lição, você aprendeu que: as preferências de leitura controlam qual membro do conjunto de réplicas processa as operações de leitura, secondary e secondaryPreferred reduzem o tráfego de leitura ao custo da consistência eventual e nearest minimiza a latência em implantações distribuídas geograficamente. A seguir, exploraremos a fragmentação — a estratégia do MongoDB para escalar além de um único conjunto de réplicas.

Grátis para começar

Aprenda JavaScript com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
30
Aulas
120

Perguntas Frequentes

A aula “Preferências de leitura: distribuindo a carga de leitura” é grátis?

Sim — o texto completo de “Preferências de leitura: distribuindo a carga de leitura” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de MongoDB Academy, atualize para CoddyKit PRO. O curso de MongoDB Academy inclui 4 aulas no total.

O que vou aprender em “Preferências de leitura: distribuindo a carga de leitura”?

Você configurará preferências de leitura primary, primaryPreferred, secondary, nearest e com rótulos para encaminhar leituras pelo conjunto de réplicas. Você pratica MongoDB Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar MongoDB Academy?

Nenhuma experiência prévia é necessária. MongoDB Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Preferências de leitura: distribuindo a carga de leitura”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de MongoDB Academy?

Sim. Cada aula de MongoDB Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Membros de um conjunto de réplicas: primário, secundário e árbitro
  2. Eleições e failover automático
  3. Garantias de gravação e durabilidade confirmada
  4. Preferências de leitura: distribuindo a carga de leitura
← Voltar para MongoDB Academy