Projetando Aplicações com Uso Intensivo de Dados – 2ª Edição
Os pilares para construir sistemas confiáveis, escaláveis e fáceis de manter
Descrição do livro
Os dados estão no centro de muitos dos desafios atuais no design de sistemas. Questões complexas, como escalabilidade, consistência, confiabilidade, eficiência e facilidade de manutenção precisam ser resolvidas. Além disso, há uma enorme variedade de sistemas disponíveis, incluindo bancos de dados relacionais, armazenamento NoSQL, data warehouses e data lakes. Sem falar em serviços na nuvem, serviços locais e bancos de dados incorporados. Quais são as escolhas certas para a sua aplicação? Como compreender todos esses modismos tecnológicos?
Nesta segunda edição, os autores Martin Kleppmann e Chris Riccomini expandem a base estabelecida na aclamada primeira edição, incorporando novas tecnologias e tendências emergentes. Ao longo do livro, você será guiado pelo labirinto de decisões e trade-offs envolvidos na construção de um sistema de dados moderno, aprenderá a escolher as ferramentas mais adequadas às suas necessidades e compreenderá os fundamentos dos sistemas distribuídos.
• Conheça os componentes internos dos sistemas que já utiliza e aprenda a usá-los de forma mais eficaz
• Tome decisões mais acertadas ao identificar as vantagens e desvantagens de cada ferramenta
• Saiba como os principais serviços em nuvem são projetados para oferecer escalabilidade, tolerância a falhas e consistência
• Compreenda os princípios fundamentais sobre os quais os bancos de dados modernos são construídos
Ver menos ▲Sumário
- Prefácio
- CAPÍTULO 1: Trade-offs na arquitetura de sistemas de dados
- Sistemas operacionais versus analíticos
- Caracterizando o processamento de transações e análise de dados
- Data warehouse
- Sistemas de registro e de dados derivados
- Nuvem versus auto-hospedagem
- Vantagens e desvantagens de serviços em nuvem
- Arquitetura de sistemas cloud-native
- Operações na era da nuvem
- Sistemas distribuídos versus sistemas de nó único
- Problemas com sistemas distribuídos
- Microsserviços e arquitetura serverless
- Computação em nuvem versus supercomputação
- Sistemas de dados, legislação e sociedade
- Resumo
- CAPÍTULO 2: Definindo requisitos não funcionais
- Estudo de caso: timelines em redes sociais
- Representando usuários, publicações e relações de follow
- Materializando e atualizando timelines
- Descrevendo o desempenho
- Latência e tempo de resposta
- Média, mediana e percentis
- Uso de métricas de tempo de resposta
- Confiabilidade e tolerância a falhas
- Tolerância a falhas
- Falhas de hardware e software
- Seres humanos e confiabilidade
- Escalabilidade
- Compreendendo a carga
- Arquiteturas de memória compartilhada, disco compartilhado e sem compartilhamento
- Princípios para escalabilidade
- Facilidade de manutenção
- Operabilidade: facilitando operações
- Simplicidade: gerenciando a complexidade
- Evolutividade: facilitando mudanças
- Resumo
- CAPÍTULO 3: Modelos de dados e linguagens de consulta
- Modelo de documentos versus modelo relacional
- Incompatibilidade objeto-relacional
- Normalização, desnormalização e joins
- Relacionamentos muitos-para-um e muitos-para-muitos
- Esquemas estrela e floco de neve: esquemas para análise de dados
- Quando utilizar cada modelo
- Modelos de dados de grafos
- Grafos de propriedades
- Linguagem de consulta Cypher
- Consultas em grafos com SQL
- Triple stores e SPARQL
- Datalog: consultas relacionais recursivas
- GraphQL
- Event sourcing e CQRS
- DataFrames, matrizes e arrays
- Resumo
- CAPÍTULO 4: Armazenamento e recuperação
- Armazenamento e indexação para OLTP
- Armazenamento estruturado em log
- Árvores B
- Comparando árvores B e LSM
- Índices multicoluna e secundários
- Armazenando valores dentro do índice
- Mantendo os dados em memória
- Armazenamento de dados para análise
- Data warehouses em nuvem
- Armazenamento orientado a colunas
- Execução de consultas: compilação e vetorização
- Views materializadas e cubos de dados
- Índices multidimensionais e de texto completo
- Busca por texto completo
- Embeddings vetoriais
- Resumo
- CAPÍTULO 5: Codificação e evolução
- Formatos para codificação de dados
- Formatos específicos de linguagem
- JSON, XML e variantes binárias
- Protocol Buffers
- Avro
- Vantagens de utilizar esquemas
- Modos de fluxo de dados
- Fluxo de dados por meio de bancos de dados
- Fluxo de dados por meio de serviços: REST e RPC
- Execução durável e fluxos de trabalho
- Arquiteturas orientadas a eventos
- Resumo
- CAPÍTULO 6: Replicação
- Replicação com líder único
- Replicação síncrona versus assíncrona
- Configurando novos seguidores
- Lidando com indisponibilidade de nós
- Implementação de logs de replicação
- Problemas com atraso de replicação
- Soluções para atraso de replicação
- Replicação multilíder
- Operação distribuída geograficamente
- Mecanismos de sincronização e software local-first
- Lidando com gravações conflitantes
- Replicação sem líder
- Gravando no banco de dados quando um nó está indisponível
- Desempenho: replicação com líder único versus replicação sem líder
- Operação em múltiplas regiões
- Detectando gravações concorrentes
- Resumo
- CAPÍTULO 7: Sharding
- Vantagens e desvantagens do sharding
- Sharding para multitenancy
- Sharding de dados do tipo chave-valor
- Sharding por intervalo de chave
- Sharding por hash da chave
- Cargas de trabalho desbalanceadas e mitigação de hot spots
- Operações: rebalanceamento automático versus manual
- Roteamento de solicitações
- Sharding e índices secundários
- Índices secundários locais
- Índices secundários globais
- Resumo
- CAPÍTULO 8: Transações
- O que exatamente é uma transação?
- Significado de ACID
- Operações de objeto único e de múltiplos objetos
- Níveis fracos de isolamento
- Read-committed
- Snapshot isolation e repeatable read
- Evitando lost updates
- Write skew e phantoms
- Serializabilidade
- Execução serial real
- Two-phase locking
- Serializable snapshot isolation
- Transações distribuídas
- Two-phase commit
- Transações distribuídas em diferentes sistemas
- Transações distribuídas internas ao banco de dados
- Recapitulando o processamento de mensagens com semântica exatamente uma vez
- Resumo
- CAPÍTULO 9: Problemas com sistemas distribuídos
- Falhas e falhas parciais
- Redes não confiáveis
- Limitações do TCP
- Falhas de rede na prática
- Detecção de falhas
- Timeouts e atrasos ilimitados
- Redes síncronas versus assíncronas
- Relógios não confiáveis
- Relógios de hora do dia versus monotônicos
- Sincronização e precisão de relógios
- Dependendo de relógios sincronizados
- Pausas de processo
- Conhecimento, verdade e mentiras
- A maioria decide
- Locks e leases distribuídos
- Falha bizantina
- Modelo de sistema e realidade
- Métodos formais e testes aleatorizados
- Resumo
- CAPÍTULO 10: Consistência e consenso
- Linearizabilidade
- O que torna um sistema linearizável?
- Confiando na linearizabilidade
- Implementando sistemas linearizáveis
- Custo da linearizabilidade
- Geradores de IDs e relógios lógicos
- Relógios lógicos
- Geradores linearizáveis de IDs
- Consenso
- As várias faces do consenso
- Consenso na prática
- Serviços de coordenação
- Resumo
- CAPÍTULO 11: Processamento em lote
- Processamento em lote com ferramentas Unix
- Análise simples de logs
- Utilizando uma sequência de comandos versus criando um programa personalizado
- Ordenação versus agregação em memória
- Processamento em lote em sistemas distribuídos
- Sistemas de arquivos distribuídos
- Armazenamentos de objetos
- Orquestração distribuída de jobs
- Modelos de processamento em lote
- MapReduce
- Mecanismos de fluxo de dados
- Shuffling de dados
- Joins e agrupamento
- Linguagens de consulta
- DataFrames
- Casos de uso de processamento em lote
- Extract–Transform–Load
- Análise de dados
- Machine learning
- Disponibilizando dados derivados
- Resumo
- CAPÍTULO 12: Processamento de fluxos (streams)
- Transmissão de fluxos de eventos
- Sistemas de mensageria
- Brokers de mensagens baseados em log
- Bancos de dados e fluxos
- Mantendo sistemas sincronizados
- Captura de dados de mudança
- Estado, fluxos e imutabilidade
- Processando fluxos
- Usos do processamento de fluxos
- Lidando com o tempo
- Joins de fluxos (streams)
- Tolerância a falhas
- Resumo
- CAPÍTULO 13: Uma filosofia dos sistemas de streaming
- Integração de dados
- Combinando ferramentas especializadas por meio de dados derivados
- Processamentos em lote e de fluxos
- Desacoplando bancos de dados
- Compondo tecnologias de armazenamento de dados
- Projetando aplicações em torno de fluxos de dados
- Observando estado derivado
- Buscando corretude
- Argumento ponta a ponta para bancos de dados
- Impondo restrições
- Pontualidade e integridade
- Confie, mas verifique
- Resumo
- CAPÍTULO 14: Fazendo a coisa certa
- Análise preditiva
- Viés e discriminação
- Responsabilidade e prestação de contas
- Loops de feedback
- Privacidade e rastreamento
- Vigilância
- Consentimento e liberdade de escolha
- Privacidade e uso de dados
- Dados como ativos e poder
- Relembrando a Revolução Industrial
- Legislação e autorregulação
- Resumo
- Glossário
- Índice remissivo
Sobre os autores
Martin Kleppmann é professor associado de sistemas distribuídos na Universidade de Cambridge. Anteriormente, foi fundador de startup e engenheiro de software no LinkedIn, atuando com infraestrutura de dados em larga escala.… Ver perfil completo ▶
Chris Riccomini é engenheiro de software, investidor em startups e autor. Foi um dos criadores do Apache Samza e do SlateDB, coautor do livro The Missing README e administra a Materialized View Capital.… Ver perfil completo ▶






