Iniciar teste gratuito
Searching...
SoBrief
Português
EnglishEnglish
EspañolSpanish
简体中文Chinese
繁體中文Chinese (Traditional)
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Designing Data-Intensive Applications

Designing Data-Intensive Applications

As Grandes Ideias por Trás de Sistemas Confiáveis, Escaláveis e Sustentáveis
por Martin Kleppmann 2015 614 páginas
4.70
10.000+ avaliações
Ouvir
Experimente o Acesso Completo por 3 Dias
Desbloqueie o áudio e muito mais!
Continuar

Principais Lições

1. Sistemas distribuídos enfrentam desafios únicos devido à instabilidade da rede

As consequências desses problemas são profundamente desorientadoras para quem não está habituado a sistemas distribuídos.

Incerteza na rede. Sistemas distribuídos operam num ambiente onde falhas, atrasos e partições de rede são comuns. Ao contrário dos sistemas de nó único, não há garantia de que uma mensagem enviada será recebida, nem quando isso acontecerá. Essa incerteza obriga que os sistemas distribuídos sejam projetados com tolerância a falhas e resiliência em mente.

Falhas parciais. Em um sistema distribuído, alguns componentes podem falhar enquanto outros continuam funcionando. Esse cenário de falha parcial é exclusivo dos sistemas distribuídos e complica significativamente o design e a operação do sistema. Os desenvolvedores precisam considerar situações em que:

  • Nós se tornam inacessíveis devido a problemas de rede
  • Mensagens são perdidas ou atrasadas
  • Alguns nós processam requisições enquanto outros estão fora do ar

Desafios de consistência. A ausência de memória compartilhada e estado global torna difícil manter a consistência entre os nós. Cada nó possui sua própria visão local do sistema, que pode ficar desatualizada ou inconsistente em relação às visões dos demais.

2. Relógios e sincronização de tempo são problemáticos em ambientes distribuídos

Não existe um tempo global e preciso que um sistema distribuído possa usar.

Deriva dos relógios. Relógios físicos em máquinas diferentes inevitavelmente se desviam com o tempo. Mesmo com tentativas regulares de sincronização, sempre há um grau de incerteza sobre o tempo exato em todo o sistema distribuído. Essa deriva pode causar:

  • Problemas na ordenação de transações distribuídas
  • Carimbos de tempo inconsistentes em eventos
  • Dificuldade em determinar relações de causa e efeito

Limitações da sincronização. Protocolos como o NTP (Network Time Protocol) tentam sincronizar relógios entre máquinas, mas estão sujeitos a atrasos de rede e não garantem sincronização perfeita. Essa incerteza implica que:

  • Carimbos de tempo de máquinas diferentes não podem ser comparados diretamente
  • Operações baseadas em tempo (como bloqueios distribuídos) precisam considerar o desvio dos relógios
  • Algoritmos que dependem de tempo preciso podem falhar de formas inesperadas

Alternativas de tempo lógico. Para contornar esses problemas, sistemas distribuídos frequentemente usam relógios lógicos ou mecanismos de ordenação parcial em vez de depender do tempo físico sincronizado. Abordagens como os carimbos de Lamport ou relógios vetoriais permitem ordenar eventos de forma consistente sem precisar de relógios físicos sincronizados.

3. Consenso é crucial, mas difícil de alcançar em sistemas distribuídos

As discussões sobre esses sistemas beiram o filosófico: o que sabemos ser verdadeiro ou falso em nosso sistema?

Desafios do acordo. Alcançar consenso entre nós distribuídos é um problema fundamental. É essencial para tarefas como:

  • Eleger um nó líder
  • Concordar sobre a ordem das operações
  • Garantir estado consistente entre réplicas

No entanto, o consenso é dificultado por atrasos na rede, falhas de nós e informações conflitantes.

Implicações do teorema CAP. O teorema CAP afirma que, diante de partições de rede, um sistema distribuído deve escolher entre consistência e disponibilidade. Essa escolha fundamental molda o design de algoritmos de consenso e bancos de dados distribuídos. Os sistemas precisam decidir se:

  • Priorizam forte consistência, mesmo que isso reduza a disponibilidade
  • Favorecem a disponibilidade, aceitando possíveis inconsistências

Algoritmos de consenso. Diversos algoritmos foram desenvolvidos para resolver o problema do consenso, incluindo:

  • Paxos
  • Raft
  • Zab (usado no ZooKeeper)
    Cada um apresenta seus próprios trade-offs em termos de complexidade, desempenho e tolerância a falhas.

4. Transações distribuídas exigem design cuidadoso para manter a consistência

Transações ACID não são uma lei da natureza; foram criadas com um propósito, que é simplificar o modelo de programação para aplicações que acessam um banco de dados.

Propriedades ACID. Transações distribuídas buscam manter as propriedades ACID (Atomicidade, Consistência, Isolamento, Durabilidade) entre múltiplos nós. Isso é desafiador porque:

  • Atomicidade exige execução tudo-ou-nada entre os nós
  • Consistência deve ser mantida mesmo diante de partições de rede
  • Isolamento requer coordenação para evitar operações conflitantes
  • Durabilidade precisa ser garantida em múltiplos nós que podem falhar

Commit em duas fases. O protocolo de commit em duas fases (2PC) é comumente usado para transações distribuídas. Ele envolve:

  1. Fase de preparação: o coordenador pergunta a todos os participantes se podem confirmar
  2. Fase de commit: se todos concordarem, o coordenador instrui todos a confirmar; caso contrário, abortam

Porém, o 2PC tem limitações, incluindo bloqueios potenciais se o coordenador falhar.

Abordagens alternativas. Para superar as limitações das transações ACID estritas em sistemas distribuídos, surgiram modelos alternativos:

  • Padrão Saga para transações de longa duração
  • Modelo BASE (Basicamente Disponível, Estado Suave, Consistência Eventual)
  • Transações compensatórias para lidar com falhas

5. Estratégias de replicação equilibram disponibilidade e consistência dos dados

Existem várias formas de lidar com replicação, e alguns trade-offs importantes devem ser considerados.

Modelos de replicação. Sistemas distribuídos utilizam diferentes estratégias para melhorar disponibilidade e desempenho:

  • Replicação com líder único
  • Replicação com múltiplos líderes
  • Replicação sem líder

Cada modelo oferece diferentes compromissos entre consistência, disponibilidade e latência.

Níveis de consistência. A replicação traz o desafio de manter a consistência entre as cópias. Sistemas frequentemente oferecem múltiplos níveis de consistência:

  • Consistência forte: todas as réplicas estão sempre sincronizadas
  • Consistência eventual: as réplicas convergem ao longo do tempo
  • Consistência causal: preserva relações causais entre operações

Resolução de conflitos. Quando múltiplas cópias podem ser atualizadas independentemente, conflitos podem surgir. Estratégias para resolvê-los incluem:

  • Última escrita vence (baseado em carimbos de tempo)
  • Vetores de versão para rastrear histórico de atualizações
  • Funções de mesclagem específicas da aplicação

6. Particionamento de dados entre nós permite escalabilidade, mas traz complexidade

A principal razão para particionar dados é a escalabilidade.

Estratégias de particionamento. Os dados podem ser particionados entre nós usando diferentes abordagens:

  • Particionamento por intervalo: divisão baseada em faixas de chaves
  • Particionamento por hash: uso de função hash para distribuir dados
  • Particionamento baseado em diretório: serviço separado para rastrear localização dos dados

Cada estratégia impacta a distribuição dos dados, desempenho das consultas e flexibilidade do sistema.

Desafios do reequilíbrio. Conforme o sistema cresce ou diminui, pode ser necessário redistribuir dados entre os nós. Esse processo, chamado reequilíbrio, deve ser feito com cuidado para:

  • Minimizar movimentação de dados
  • Manter distribuição equilibrada
  • Evitar interrupções nas operações em andamento

Índices secundários. O particionamento se torna mais complexo ao lidar com índices secundários. As opções incluem:

  • Particionar índices secundários por documento
  • Particionar índices secundários por termo

Cada abordagem apresenta diferentes trade-offs em desempenho de escrita e capacidade de consulta.

7. Tolerância a falhas é essencial, mas exige design cuidadoso do sistema

Trabalhar com sistemas distribuídos é fundamentalmente diferente de programar em um único computador — e a principal diferença é que há muitas formas novas e interessantes de as coisas darem errado.

Modos de falha. Sistemas distribuídos precisam lidar com vários tipos de falhas:

  • Quedas de nós
  • Partições de rede
  • Falhas bizantinas (nós se comportando erroneamente ou maliciosamente)

Projetar para tolerância a falhas requer antecipar e mitigar esses cenários.

Redundância e replicação. Estratégias-chave para tolerância incluem:

  • Replicação de dados em múltiplos nós
  • Uso de componentes redundantes (como múltiplos caminhos de rede)
  • Implementação de mecanismos de failover

Porém, a redundância sozinha não basta; o sistema deve detectar falhas e reagir adequadamente.

Degradação graciosa. Sistemas distribuídos bem projetados devem continuar funcionando, mesmo que com capacidades reduzidas, diante de falhas parciais. Isso envolve:

  • Isolar falhas para evitar efeitos em cascata
  • Priorizar funcionalidades críticas
  • Fornecer feedback claro aos usuários sobre o estado do sistema

8. Modelos de consistência oferecem trade-offs entre correção e desempenho

Linearizabilidade é um tema recorrente em sistemas distribuídos: é um modelo de consistência muito forte.

Espectro de consistência. Sistemas distribuídos oferecem uma gama de modelos de consistência, do forte ao fraco:

  • Linearizabilidade: modelo mais forte, parece que todas as operações ocorrem atomicamente
  • Consistência sequencial: preserva a ordem das operações para cada cliente
  • Consistência causal: mantém relações causais entre operações
  • Consistência eventual: modelo mais fraco, garante convergência ao longo do tempo

Modelos mais fortes proporcionam comportamento mais intuitivo, mas geralmente com maior latência e menor disponibilidade.

Implicações do teorema CAP. A escolha do modelo de consistência é influenciada pelo teorema CAP:

  • Modelos fortes limitam a disponibilidade durante partições de rede
  • Modelos mais fracos permitem maior disponibilidade, mas podem expor inconsistências

Considerações para aplicações. O modelo adequado depende dos requisitos específicos da aplicação:

  • Sistemas financeiros geralmente exigem consistência forte
  • Aplicações de redes sociais podem tolerar consistência eventual
  • Alguns sistemas usam níveis diferentes para operações distintas

9. O design de sistemas distribuídos deve considerar falhas parciais

Em sistemas distribuídos, tentamos incorporar tolerância a falhas parciais no software, para que o sistema como um todo continue funcionando mesmo quando algumas partes falham.

Detecção de falhas. Identificar falhas em sistemas distribuídos é desafiador devido à incerteza da rede. Abordagens comuns incluem:

  • Mecanismos de heartbeat
  • Protocolos gossip
  • Detectores de falha phi-accrual

No entanto, muitas vezes é impossível distinguir entre um nó falho e uma partição de rede.

Tratamento de falhas. Após detectar uma falha, o sistema deve reagir adequadamente:

  • Eleger novos líderes
  • Redirecionar requisições
  • Iniciar processos de recuperação

O objetivo é manter disponibilidade e consistência apesar das falhas parciais.

Princípios de design. Princípios-chave para construir sistemas distribuídos robustos incluem:

  • Assumir que falhas ocorrerão e projetar para isso
  • Usar timeouts e tentativas, mas estar ciente de suas limitações
  • Implementar circuit breakers para evitar falhas em cascata
  • Projetar para idempotência, permitindo lidar com requisições duplicadas com segurança

Este resumo aborda os desafios fundamentais e princípios dos sistemas distribuídos. Destaca as dificuldades únicas causadas pela instabilidade da rede, problemas de sincronização temporal e a necessidade de consenso. Explora estratégias para manter a consistência em transações distribuídas, equilibrar replicação e particionamento de dados, e projetar para tolerância a falhas. Também discute os trade-offs na escolha de modelos de consistência e a importância de considerar falhas parciais no design do sistema. Ao longo do texto, ressalta as considerações filosóficas e práticas que moldam a arquitetura e implementação de sistemas distribuídos.

Última atualização:

Report Issue

Resumo das Resenhas

4.70 de 5
Média de 10.000+ avaliações do Goodreads e Amazon.

Designing Data-Intensive Applications é amplamente reconhecido como uma leitura indispensável para engenheiros de software e desenvolvedores. Os leitores valorizam a sua abordagem abrangente sobre armazenamento de dados, sistemas distribuídos e conceitos modernos de bases de dados. O livro destaca-se pelas explicações claras, exemplos práticos e diagramas elucidativos. Muitos consideram-no uma verdadeira mini-enciclopédia de engenharia de dados, oferecendo conhecimentos valiosos tanto para iniciantes como para profissionais experientes. Embora algumas secções possam parecer desafiantes ou demasiado académicas, a maioria concorda que o livro estabelece uma base sólida para compreender sistemas e arquiteturas de dados complexos.

Your rating:
4.73
600 avaliações
Want to read the full book?

Perguntas Frequentes

What's Designing Data-Intensive Applications about?

  • Focus on Data Systems: The book explores the principles and practices behind building reliable, scalable, and maintainable data-intensive applications. It covers various architectures, data models, and the trade-offs involved in designing these systems.
  • Enduring Principles: Despite rapid technological changes, the book emphasizes fundamental principles that remain constant across different systems, equipping readers to make informed decisions about data architecture.
  • Real-World Examples: Martin Kleppmann uses examples from successful data systems to illustrate key concepts, making complex ideas more accessible through practical applications.

Why should I read Designing Data-Intensive Applications?

  • Comprehensive Overview: The book provides a thorough examination of data systems, making it suitable for software engineers, architects, and technical managers. It covers a wide range of topics, from storage engines to distributed systems.
  • Improved Decision-Making: By understanding the trade-offs of various technologies, readers can make better architectural decisions for their applications, crucial for meeting performance and reliability requirements.
  • Curiosity and Insight: For those curious about how data systems work, the book offers deep insights into the internals of databases and data processing systems, encouraging critical thinking about application design.

What are the key takeaways of Designing Data-Intensive Applications?

  • Reliability, Scalability, Maintainability: The book emphasizes these three principles as essential for building robust data-intensive applications.
  • Understanding Trade-offs: It highlights the importance of understanding trade-offs in system design, such as the CAP theorem, which states that "you can only pick two out of consistency, availability, and partition tolerance."
  • Data Models and Replication: The choice of data model significantly impacts application performance, and the book discusses various replication strategies and their implications for consistency.

What are the best quotes from Designing Data-Intensive Applications and what do they mean?

  • "Technology is a powerful force in our society.": This quote underscores the dual nature of technology, serving as a reminder of the ethical responsibilities in building data systems.
  • "The truth is the log. The database is a cache of a subset of the log.": This encapsulates the idea of event sourcing, where the log of events is the authoritative source, and the database provides a read-optimized view.
  • "If you understand those principles, you’re in a position to see where each tool fits in.": Highlights the importance of grasping fundamental principles to effectively utilize various technologies.

How does Designing Data-Intensive Applications define reliability, scalability, and maintainability?

  • Reliability: Refers to the system's ability to function correctly even in the face of faults, involving design strategies to tolerate hardware failures, software bugs, and human errors.
  • Scalability: Concerns how well a system can handle increased load, requiring strategies like partitioning and replication to cope with growth in data volume, traffic, or complexity.
  • Maintainability: Focuses on how easily a system can be modified and updated over time, emphasizing simplicity, operability, and evolvability for productive team work.

What is the CAP theorem in Designing Data-Intensive Applications?

  • Consistency, Availability, Partition Tolerance: The CAP theorem states that in a distributed data store, it is impossible to simultaneously guarantee all three properties.
  • Trade-offs in Design: Emphasizes the trade-offs system designers must make, such as sacrificing availability during network failures to prioritize consistency and partition tolerance.
  • Historical Context: Introduced by Eric Brewer in 2000, the theorem has significantly influenced the design of distributed systems.

How does Designing Data-Intensive Applications explain data models and query languages?

  • Data Models: Compares various data models, including relational, document, and graph models, each with strengths and weaknesses, crucial for selecting the right one based on application needs.
  • Query Languages: Discusses different query languages like SQL for relational databases and those for NoSQL systems, essential for effectively interacting with data.
  • Use Cases: Emphasizes that different applications have different requirements, guiding informed decisions about data architecture.

What are the different replication methods in Designing Data-Intensive Applications?

  • Single-Leader Replication: Involves one node as the leader processing all writes and replicating changes to followers, common but can lead to bottlenecks.
  • Multi-Leader Replication: Allows multiple nodes to accept writes, improving flexibility and availability but introducing complexities in conflict resolution.
  • Leaderless Replication: Any node can accept writes, improving availability but requiring careful management of consistency.

How does Designing Data-Intensive Applications address schema evolution?

  • Schema Changes: Discusses the inevitability of application changes requiring corresponding data schema changes, emphasizing backward and forward compatibility.
  • Encoding Formats: Explores various encoding formats like JSON, XML, and binary formats, highlighting trade-offs associated with each for schema evolution.
  • Practical Strategies: Provides advice on handling schema changes in real-world applications, ensuring old and new data versions can coexist without issues.

What is the significance of event sourcing in Designing Data-Intensive Applications?

  • Immutable Event Log: Involves storing all changes as an immutable log of events, allowing easy reconstruction of the current state by replaying the log.
  • Separation of Concerns: Enables multiple views of data from the same log, allowing for easier application evolution over time.
  • Auditability and Recovery: Provides a clear audit trail of changes, simplifying recovery from errors by rebuilding the state from the event log.

How does Designing Data-Intensive Applications propose handling network partitions?

  • Network Faults: Explains that network partitions can lead to inconsistencies across replicas, complicating distributed system design.
  • Handling Partitions: Discusses strategies like the CAP theorem, which states a system can only guarantee two of three properties: Consistency, Availability, and Partition Tolerance.
  • Practical Implications: Emphasizes designing systems that tolerate network faults and continue operating effectively.

What are the ethical considerations in Designing Data-Intensive Applications?

  • Responsibility of Engineers: Stresses the ethical implications of data collection and usage, including awareness of potential biases and discrimination in algorithms.
  • Impact of Predictive Analytics: Discusses risks associated with predictive analytics, urging careful consideration of data-driven decisions and their consequences.
  • Surveillance Concerns: Raises concerns about surveillance capabilities, advocating for user privacy, transparency, and control over personal data.

Sobre o Autor

Martin Kleppmann é um especialista reconhecido mundialmente em sistemas distribuídos e engenharia de dados. É mais conhecido pelo seu trabalho no Apache Samza e pelas suas contribuições à infraestrutura de dados do LinkedIn. A sua experiência em bases de dados, sistemas de mensagens e processamento de dados está patente ao longo de todo o livro. O seu estilo de escrita é elogiado pela clareza e pela capacidade de explicar conceitos complexos de forma acessível. Com uma formação que abrange tanto o meio académico como a indústria, Kleppmann consegue ligar a teoria à prática de modo eficaz. O seu trabalho teve um impacto significativo no campo das aplicações intensivas em dados e dos sistemas distribuídos.

Follow
Ouvir
Now playing
Designing Data-Intensive Applications
0:00
-0:00
Now playing
Designing Data-Intensive Applications
0:00
-0:00
1x
Queue
Home
Swipe
Library
Get App
Try Full Access for 3 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
Read unlimited summaries. Free users get 3 per month
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 26,000+ books. That's 12,000+ hours of audio!
Day 2: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 3: Your subscription begins
You'll be charged on Jun 9,
cancel anytime before.
Consume 2.8× More Books
2.8× more books Listening Reading
Our users love us
600,000+ readers
Trustpilot Rating
TrustPilot
4.6 Excellent
This site is a total game-changer. I've been flying through book summaries like never before. Highly, highly recommend.
— Dave G
Worth my money and time, and really well made. I've never seen this quality of summaries on other websites. Very helpful!
— Em
Highly recommended!! Fantastic service. Perfect for those that want a little more than a teaser but not all the intricate details of a full audio book.
— Greg M
Save 62%
Yearly
$119.88 $44.99/year/yr
$3.75/mo
Monthly
$9.99/mo
Start a 3-Day Free Trial
3 days free, then $44.99/year. Cancel anytime.
Unlock a world of fiction & nonfiction books
26,000+ books for the price of 2 books
Read any book in 10 minutes
Discover new books like Tinder
Request any book if it's not summarized
Read more books than anyone you know
#1 app for book lovers
Lifelike & immersive summaries
30-day money-back guarantee
Download summaries in EPUBs or PDFs
Cancel anytime in a few clicks
Scanner
Find a barcode to scan

We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel
Settings
General
Widget
Loading...
We have a special gift for you
Open
38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel