Como tornar sistemas confiáveis, apesar de humanos não serem confiáveis?
Sobre o livro
Designing Data-Intensive Applications é um livro escrito por Martin Kleppmann que fornece uma visão geral completa e detalhada dos desafios enfrentados ao construir aplicativos de dados intensivos. O livro aborda tópicos como escalabilidade, desempenho, consistência e tolerância a falhas, e fornece uma compreensão profunda das ferramentas e técnicas disponíveis para lidar com esses desafios. Com base em exemplos reais e casos de uso, o livro fornece uma visão prática sobre como projetar e implementar aplicativos de dados intensivos de maneira confiável e escalável. Ele é considerado uma referência valiosa para desenvolvedores, arquitetos de sistemas e engenheiros de dados que trabalham com aplicativos de dados intensivos.
Para quem é destinado o livro?
- Desenvolvedores que tenham algum servidor/backend;
- Engenheiros, arquitetos de software e gerentes técnicos que adoram codificar;
- Pessoas que desejam aprender como tornar sistemas de dados escaláveis;
- Pessoas que precisem tornar os aplicativos altamente disponíveis e operacionalmente robustos.
Pensando em Sistemas de Dados
Confiabilidade
O sistema deve continuar a funcionar corretamente (executando a função correta no nível de desempenho desejado) mesmo em face de adversidades (falhas de hardware ou software e até erro humano)
Martin começa o capítulo definindo o que é confiabilidade para seus leitores. Além disso, ele nos mostra quais expectativas a confiabilidade deve atender para um software, são essas:
- O software executa a função que o usuário espera;
- O software pode tolerar que o usuário cometa erros, ou o use de maneiras inesperadas;
- Seu desempenho é bom o suficiente para o caso de uso necessário, sob a carga esperada e o volume de dados;
- O sistema impede qualquer acesso não autorizado e abusivo.
Diante de todas essas expectativas, se todas essas coisas unidas significam “trabalhar corretamente”, podemos então entender que confiabilidade, a grosso modo, é continuar a funcionar corretamente, mesmo quando as coisas dão errado.
Falhas x Fracassos em Sistemas
Uma falha é geralmente definida como um componente do sistema desviando de sua especificação. Por exemplo, um disco rígido pode falhar se deixar de funcionar devido a uma falha mecânica. Por outro lado, um fracasso é quando o sistema como um todo deixa de fornecer o serviço requerido ao usuário. Isso pode ocorrer quando uma falha em um componente do sistema impede que o sistema forneça seu serviço.
É impossível reduzir a probabilidade de falha a zero. Portanto, é importante projetar mecanismos de tolerância a falhas que evitem que falhas causem fracassos. Existem várias técnicas para construir sistemas confiáveis a partir de partes não confiáveis, como redundância, tolerância a falhas de software e hardware, entre outros.
Em resumo, entender a diferença entre falhas e fracassos é fundamental para desenvolver sistemas seguros e confiáveis. Projetar mecanismos de tolerância a falhas é uma das principais técnicas para evitar que falhas causem fracassos e garantir que o sistema continue fornecendo o serviço requerido ao usuário mesmo em situações de falha.
Falhas de hardware x Falhas de software
As falhas de hardware são problemas físicos que afetam componentes do sistema, como discos rígidos, processadores e memória. Elas podem ocorrer devido a vários fatores, incluindo desgaste, mau uso, erros de fabricação e condições ambientais adversas. As falhas de hardware podem ser detectadas e corrigidas através de manutenção preventiva e substituição de componentes.
Por outro lado, as falhas de software são problemas lógicos que afetam os programas e sistemas operacionais. Elas podem ocorrer devido a bugs no código, configurações incorretas ou problemas de integridade de dados. As falhas de software podem ser detectadas e corrigidas através de testes minuciosos e atualizações de software.
Uma das principais abordagens para prevenir falhas de hardware e software é o teste minucioso, incluindo testes de unidade, testes de integração e testes manuais. O teste automatizado é amplamente utilizado e especialmente valioso para cobrir casos extremos que raramente surgem na operação normal.
Erros humanos
E finalmente chegamos no tópico que deu origem ao título de hoje. Martin afirma que “Humanos são seres falíveis e, portanto, podem cometer erros que afetam a confiabilidade dos sistemas.”
No entanto, é possível tornar sistemas confiáveis, mesmo diante da natureza humana. Os melhores sistemas combinam várias abordagens para minimizar as chances de erro humano e maximizar a confiabilidade.
- Projetar sistemas de forma a minimizar as oportunidades de erro;
- Separe os lugares onde as pessoas cometem mais erros dos lugares onde podem causar falhas;
- Teste minuciosamente em todos os níveis, desde testes de unidade até testes de integração de todo o sistema e testes manuais;
- Permitir uma recuperação rápida e fácil de erros humanos, para minimizar o impacto em caso de falha;
- Configurar monitoramento detalhado e claro, como métricas de desempenho e taxas de erro.
O que entendemos até aqui?
Diante de tudo que foi dito acima, o que podemos afirmar é que confiabilidade não é só para projetos em que um bug ou um problema pode fazer com que a empresa perca milhões, mas também para aqueles menores que temos responsabilidade para com nossos usuários.
Imagine um pai que armazena todas as fotos e vídeos de seus filhos em seu aplicativo de fotos por exemplo. Como eles se sentiriam se esse banco de dados fosse subitamente corrompido?
Existem situações em que podemos escolher sacrificar a confiabilidade para reduzir o custo de desenvolvimento, mas precisamos estar muito consciente do que essa decisão pode causar.
Lista de postagens
- Capítulo 1 — Confiabilidade
- Capítulo 2 — Escalabilidade (parte 1)
- Capítulo 2 — Escalabilidade (parte 2) (em construção…)