O documento discute como criar aplicações escaláveis e resilientes. Aborda problemas como compartilhamento de estado, pontos únicos de falha, dependências opcionais e testes. Recomenda não armazenar estado localmente, usar sistemas de arquivos e bancos de dados distribuídos, cache HTTP e circuit breakers para lidar com falhas de dependências.
1. Como fazer uma aplicação
que não cai
Alexander Ramos Jardim - Volanty
2. Quem sou eu?
● Gerente de Tecnologia na Volanty desde fevereiro/2019
● experiência com e-commerce, telecom, pesquisas de mercado, automotivos
● + de 15 anos trabalhando com internet
● backend
● suporte comercial
● devops
3. Do que estamos falando?
● internet e serviços integrados
● sites
● backend for frontends
● apis http
● integrações com fontes de dados massivas
9. Por que uma aplicação cai?
Problemas de Escalabilidade
Problemas de Resiliência
10. Escalabilidade
"Em telecomunicações, infraestrutura de tecnologia da informação e na
engenharia de software, escalabilidade é uma característica desejável em todo o
sistema, rede ou processo, que indica a capacidade de manipular uma porção
crescente de trabalho de forma uniforme, ou estar preparado para crescer. Por
exemplo, isto pode-se referir à capacidade de um sistema suportar um aumento
de carga total quando os recursos (normalmente do hardware) assim requisitam."
https://pt.wikipedia.org/wiki/Escalabilidade
12. Escalabilidade
Vertical
● compartilhamento de estado
mais simples
● complexidade de deployment
reduzida
● impacto de indisponibilidade é o
mesmo
● busca por desempenho
Horizontal
● estado distribuído, complexo de
compartilhar
● deployment flexível
● impacto de indisponibilidade é
dividido por nó
● busca por resiliência
23. Resiliência
"Capacidade que tem um sistema dinâmico de se adaptar com certo sucesso a
perturbações, de forma a neutralizar ameaças as funções, a viabilidade ou ao
desenvolvimento."
http://papers.cumincad.org/data/works/att/sigradi2017_076.pdf
25. Resiliência
● Trate os erros de
dependências
opcionais e
não-críticas
● Retry: apenas 1 vez
e nunca no mesmo
nó
● Interrompa
chamadas por um
tempo aceitável
● CIRCUIT
BREAKERS!!!
27. Resiliência
Testes unitários
● Isole as regras do modelo de dados
● Teste alguns casos de erro mais comuns
● Tente montar objetos inválidos
● Se tiver que escrever somente um tipo de teste, escreva testes unitários
● Sempre comece pelo caminho triste
28. Resiliência
Testes integrados
● Teste seus circuit breakers aqui!!!
● Escreva chamadas erradas
● Não adicione mocks das dependências ao seu projeto
● Sempre use algum ambiente externo legítimo (dev ou hml)
● Se você criar mocks e colocar dentro do seu projeto, quando a dependência
evoluir, você não saberá
● Objetivo principal é simular outage e baixa performance