Como tornar sistemas confiáveis, apesar de humanos não serem confiáveis?

Eduardo Machado
4 min readJan 26, 2023

--

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

--

--