Armazenamento e transferência de dados. Como isso impacta a performance da sua aplicação
Saber como armazenar e transferir dados eficientemente é um dos maiores desafios que temos para a construção de aplicações performáticas e escaláveis. Vou deixar aqui algumas coisas que aprendi sobre isso nos meus quase 10 anos de carreira.
Memória RAM
A forma mais rápida é manipular os dados diretamente na RAM. A única coisa necessária para isso é declarar e usar variáveis em seu código.
Se o seu código não faz um uso eficiente de memória, você terá problemas com escalabilidade horizontal da infraestrutura.
A única coisa a se ter cuidado aqui é evitar carregar uma quantidade grande de dados sem a necessidade de usá-los no momento. Um exemplo clássico é ler todo o conteúdo de um arquivo. Prefira usar um buffer e ler o arquivo pouco a pouco.
Outra dica é usar in-memory DB (como o redis) para realizar cache de dados que são usados constantemente e compartilha-los entre diferentes instâncias. Agora precisamos adicionar o custo de enviar dados pela rede.
Redes
Trafegar dados pela rede é ordens de grandeza mais demorado que usar o dado localmente na memória RAM, isso se dá pela necessidade de se utilizar o meio físico para o transporte e por seguir todas as exigências dos protocolos. Aqui o tempo pode variar bastante pois temos muitas variáveis envolvidas.
As dicas que posso dar para otimização são:
- Não envie requisições com muitos dados mas também não faça requisições pequenas, o ideal é encontrar um meio termo e trabalhar com paginação;
- Use o protocolo correto para o seu objetivo (UDP, TCP, FTP, etc;
- Evite usar servidores muito longe dos seu publico e use CDNs;
- Se possível, deixe todos os seus serviços dentro da mesma rede ou região (já vi ganhos absurdos de performance somente por deixar o banco de dados na mesma VPC que a aplicação). No pior das hipóteses use conexão de rede dedicada para garantir o menor caminho entre um servidor ao outro.
Disco
Aqui é a camada em que o seu banco de dados atuará. Então o assunto pode ser tão complexo quanto todo o conhecimento de um DBA para otimizar o desempenho de um SGBD.
- O mais simples que posso dizer é, siga o feijão com arroz e normalize os seus dados da melhor forma possível, crie índices, faça queries eficientes e use um bom servidor dedicado para o seu banco, aliás, armazená-lo em uma máquina com HDD ao invés de SSD te trará um desempenho extremamente inferior;
- Observe métricas como o IOPS para mensurar quantas operações por segundo o seu disco consegue fazer;
- Escolha o tipo certo de disco, as vezes só queremos armazenar alguns arquivos que serão pouco acessados. Isso não necessariamente te dará desempenho, mas te ajudará a economizar com recursos.
Faça o uso de programação concorrente para otimizar as suas operações IO, só assim você conseguirá aproveitar o tempo de ociosidade enquanto os seus dados são transferidos por esses meios para realizar outras tarefas e aproveitar os seus recursos computacionais com inteligência.