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.

Hierarquia dos tipos de armazenamento

Aonde me encontrar

O assunto é interessante e importante. Se alguém quiser mais informações, é só procurar na internet sobre DOD (Data-Oriented Design).