
Você altera o endereço, recebe sucesso e atualiza a página. O endereço antigo reaparece. A escrita chegou ao líder; uma réplica atrasada serviu a leitura. Isso não comprova perda, mas revela diferença entre a promessa da interface e o caminho de dados.
Designing Data-Intensive Applications, de Martin Kleppmann, ajuda a formular essa diferença. Recomendo para comparar mecanismos por carga, falhas e garantias observáveis, antes de escolher tecnologia ou anunciar que um sistema é consistente.
Esta resenha se refere à primeira edição, de Martin Kleppmann, publicada em março de 2017, conforme a ficha da O'Reilly. Não é uma análise da segunda edição nem uma afirmação sobre a edição mais recente. A estrutura passa por fundamentos, dados distribuídos e dados derivados.
Essa amplitude permite relacionar uma decisão local a consequências que aparecem depois. Um índice influencia escrita e leitura; replicação afeta visibilidade; um relatório derivado acrescenta outro caminho de atualização. Minha sugestão é acompanhar uma operação da aplicação enquanto estuda os mecanismos, sem tentar memorizar cada produto mencionado.
Para o perfil do exemplo, descreva operações antes de escolher armazenamento: obter uma pessoa por identificador, atualizar seu endereço e produzir um relatório de perfis alterados. Essas tarefas acessam dados de formas diferentes. Também precisam de políticas distintas sobre atraso e autorização.
Um índice para busca por identificador não atende automaticamente a uma consulta por intervalo de atualização. Adicionar outro índice pode diminuir o trabalho de localizar registros, mas acrescenta manutenção nas escritas e consumo de espaço. Precisamos conhecer frequência, volume e distribuição dos acessos para avaliar esse custo, em vez de concluir que mais índices sempre ajudam.
Árvores e estruturas baseadas em log organizam leitura, gravação e reorganização de maneiras diferentes. Rótulos como otimizado para escrita não substituem testes com consultas, registros e condições operacionais relevantes. O livro ajuda a investigar, sem oferecer uma classificação universal de vencedores.
O capítulo de replicação da primeira edição inclui leitura das próprias escritas entre os problemas de atraso. O exercício original abaixo usa esse problema para separar uma promessa da interface de uma escolha de topologia.
Considere um único líder L, réplica assíncrona R e sessão S. O perfil U-7 começa na revisão 8, endereço Rua A. Neste cenário didático, o líder confirma após persistir localmente a revisão 9, endereço Rua B, sem esperar R. Não há falha de nó durante a primeira sequência.
| Ordem lógica | Operação | Estado e observação |
|---|---|---|
T0 | Estado inicial | L=v8/Rua A, R=v8/Rua A |
T1 | S atualiza endereço em L; recebe sucesso | L=v9/Rua B, R=v8/Rua A |
T2 | Depois do sucesso, S atualiza a tela lendo R | Retorna v8/Rua A |
T3 | R aplica a atualização | L=v9/Rua B, R=v9/Rua B |
Esses marcadores indicam ordem, não medições de tempo. O exercício não demonstra uma instalação real nem estabelece prazo para T3. Em T2, o dado está persistido no líder e ainda não foi aplicado pela réplica. Isso difere de uma escrita recusada ou perdida.
Defina o contrato: após confirmar a revisão 9, leituras de U-7 na sessão S não podem mostrar revisão anterior. Enquanto o líder permanece estável neste cenário, direcionar essas leituras a L é uma opção. Outras consultas podem continuar usando réplicas se o contrato permitir atraso.
Outra possibilidade é transportar um marcador da escrita e ler apenas de um nó que tenha aplicado essa posição ou uma posterior. Isso exige suporte e semântica verificáveis na infraestrutura. A revisão 9 do exemplo representa uma ordem monotônica deste perfil sob um líder; não é um token genérico seguro para comparar épocas de liderança ou partições diferentes.
Fixar a sessão a qualquer réplica não basta: ela pode continuar atrasada em relação à escrita. Esperar um intervalo fixo também não prova que a atualização foi aplicada, especialmente quando o atraso cresce. Defina se a aplicação aguarda, consulta outra origem ou devolve uma condição explícita de indisponibilidade.
Essa política não demonstra linearizabilidade do sistema. Ela protege uma relação específica entre a escrita de S e suas leituras, sem estabelecer uma ordem global para operações de todos os clientes. Também não define, sozinha, o que outro dispositivo da mesma pessoa observa se não carregar o marcador da sessão.
Direcionar leituras ao líder também desloca carga e pode acrescentar distância de rede. Esperar a réplica preserva outro caminho de leitura, mas requer prazo de espera e política para seu esgotamento. Uma aplicação não pode prometer resposta recente e rápida sob qualquer atraso. O produto precisa escolher qual consequência aceita, incluindo comunicar indisponibilidade quando não consegue cumprir a garantia.
Produtos gratuitos e pagos para transformar ideias em uma base que você consegue executar.
13 produtos disponíveisContinue explorando tópicos similares

Aplique Michael Nygard a timeouts, isolamento e recuperação com um exercício de falha controlada.

Transforme estudo passivo em projeto de aprendizagem com prática direta, feedback e recuperação espaçada.

Resenha crítica de Rob Fitzpatrick: investigue episódios reais, separe fatos de hipóteses e não confunda entrevistas com validação de mercado.
Checklist de 47 pontos para encontrar bugs, riscos de segurança e problemas de performance antes do lançamento.
Templates testados em produção, usados por desenvolvedores. Economize semanas de setup no seu próximo projeto.
Agora altere a hipótese: L falha depois de confirmar v9, antes de R recebê-la. Se uma política promover R sem recuperar aquela escrita, o endereço confirmado pode desaparecer do estado disponível. Persistência local em um nó não equivale a sobrevivência à perda desse nó.
Para prometer sobrevivência, é preciso especificar quais confirmações são exigidas e quais candidatos podem assumir liderança. Mais participantes na confirmação podem acrescentar espera e dependência de comunicação. Uma réplica atrasada oferece um problema de visibilidade; uma promoção sem a escrita confirmada acrescenta risco de perda. As soluções e custos não são os mesmos.
Se a resposta de T1 se perder, o cliente enfrenta outra situação: resultado desconhecido. Timeout não informa se houve confirmação. Uma identidade estável de operação e consulta de resultado podem ajudar, desde que o sistema mantenha esse contrato. Gerar uma identidade nova a cada tentativa torna mais difícil reconhecer a repetição da mesma intenção.
Imagine que editar o endereço também deve acrescentar um registro de auditoria. Se ambos pertencem à mesma confirmação, grave-os atomicamente no armazenamento que oferece essa garantia. Um teste deve verificar falha entre as etapas e ausência de estado parcialmente aplicado.
Isso não torna uma leitura posterior em réplica automaticamente recente. Atomicidade de escrita e visibilidade de leitura tratam de partes diferentes da operação. Também não transforme o nome de um nível de isolamento em promessa sobre qualquer sequência concorrente; investigue o comportamento documentado e as anomalias que a aplicação precisa impedir.
Kleppmann questiona classificações simplificadas em Please stop calling databases CP or AP. A discussão enfatiza definições precisas e propriedades por operação. Para o perfil, perguntar quem lê o quê depois de qual confirmação esclarece mais que atribuir duas letras ao banco inteiro.
O perfil também pode alimentar um índice de busca e um relatório. Atualizar o registro principal não atualiza necessariamente essas representações no mesmo instante. Se a busca retornar Rua A enquanto a tela de edição mostra Rua B, precisamos saber se isso é atraso permitido ou violação de uma expectativa do produto.
Processamento em lote pode reconstruir um relatório a partir de um conjunto delimitado; processamento em fluxo acompanha alterações conforme chegam. Ambos exigem decisões sobre repetição, completude e evolução de formato. A utilidade está em compreender como resultados são produzidos e reconstruídos, sem declarar que um mecanismo sempre substitui o outro.
Defina a origem de referência, o ponto até o qual a derivação avançou e a política para falhas. Reprocessar dados pode recuperar resultados, mas também reproduzir efeitos externos se o consumidor não distingue reconstrução de uma ação nova. O caminho entre dados persistidos e experiência do usuário merece a mesma atenção que a escrita inicial.
Escolha um ambiente controlado e uma configuração real de replicação. Registre versão, topologia e política de confirmação. Reproduza atraso de aplicação na réplica, execute a escrita e compare leituras da sessão. Separe uma expectativa de leitura das próprias escritas de qualquer promessa de sobrevivência a falhas.
Depois simule perda de resposta e uma mudança de liderança, conforme os mecanismos disponíveis. Observe se a aplicação consegue recuperar o resultado ou precisa comunicar incerteza. Não use o exercício para afirmar garantias que o ambiente não foi configurado para oferecer.
A tabela desta resenha não executou esses testes. Ela serve para escrever expectativas e localizar evidências ausentes. Um resultado bem-sucedido em um cenário também não cobre toda falha possível; mantenha explícitos os casos, hipóteses e limitações da verificação.
O mérito é o método comparativo. Você ganha perguntas para distinguir custo de escrita, latência, disponibilidade e recuperação. Isso ajuda a desafiar tanto a escolha de um produto por popularidade quanto a ideia de que um único mecanismo resolve todos os riscos.
A amplitude também é seu limite. Conhecer conceitos não equivale a operar uma migração ou recuperar um banco sob pressão. O leitor pode adquirir vocabulário antes de adquirir julgamento operacional. Combine a leitura com documentação, acompanhamento de quem opera o sistema e experimentos que mostrem as consequências das configurações.
Produtos e exemplos da edição de 2017 refletem aquele período. Use os conceitos como ponto de partida e confira a documentação da versão implantada antes de transportar uma afirmação específica. Uma comparação histórica não estabelece o comportamento atual de um serviço gerenciado nem inclui automaticamente seus limites de contrato.
Recomendo para quem já entende consultas SQL básicas, índices e comunicação entre processos. Não é preciso administrar um grande cluster para aproveitar, mas ajuda ter observado uma escrita, uma leitura e uma falha de rede. Um iniciante pode começar por esses experimentos e voltar aos capítulos conforme surjam perguntas.
Se a necessidade imediata é aprender a consultar uma tabela ou corrigir uma conexão, um material introdutório e a documentação do banco podem trazer retorno mais rápido. Também não adote distribuição só para praticar o livro. Um armazenamento simples que satisfaz o contrato evita coordenação que talvez seu produto ainda não necessite.
Implementing DDD ajuda a formular invariantes comerciais. Release It! complementa a análise de falhas operacionais. Clean Architecture discute dependências. DDIA aprofunda os mecanismos que precisam sustentar essas decisões; separação de camadas não escolhe a garantia de uma leitura.
Descreva uma operação real com entradas, consulta, escrita e consequência visível. Leia armazenamento e replicação, depois transações e falhas, revisando sua linha do tempo. Explore processamento derivado quando houver busca ou relatório separado.
Para cada alternativa, registre garantia desejada, custo aceito e hipótese que exige teste. Compare com a implementação atual antes de propor substituições. A prática não precisa terminar numa troca de banco.
Recomendo a primeira edição pelo raciocínio desenvolvido: distinguir dado ainda invisível, dado perdido e resultado desconhecido, explicando como chegam ao usuário. Comece pela promessa e verifique o que a sustenta.