Mas isso é realmente importante? Considere que a interface do usuário precisa fazer uma chamada de rede para a API; isso é muito grande (ordem de magnitude de milissegundos). Os bancos de dados são otimizados para manter as coisas na memória e executar leituras muito, muito rapidamente (por exemplo, o SQL Server carrega e mantém tudo na RAM e consome quase toda a RAM livre, se puder).
A lógica
Em teoria, você está correto. No entanto, existem algumas falhas nessa lógica:
Pelo que você declarou, não está claro se você realmente testou / definiu o perfil do seu aplicativo. Em outras palavras, você realmente sabe que as transferências de rede do aplicativo para a API são o componente mais lento? Por ser intuitivo, é fácil supor que sim. No entanto, ao discutir desempenho, você nunca deve assumir. No meu empregador, sou o líder de desempenho. Quando eu entrei, as pessoas continuaram falando sobre CDNs, replicação etc. com base na intuição sobre quais devem ser os gargalos. Acontece que nossos maiores problemas de desempenho foram o desempenho ruim das consultas ao banco de dados.
Você está dizendo que, como os bancos de dados são bons na recuperação de dados, o banco de dados está necessariamente em execução com desempenho máximo, está sendo usado de maneira ideal e não há nada que possa ser feito para melhorá-los. Em outras palavras, os bancos de dados são projetados para serem rápidos, portanto nunca precisarei me preocupar com isso. Outra linha de pensamento perigosa. É como dizer que um carro deve se mover rapidamente, então não preciso trocar o óleo.
Essa maneira de pensar assume um único processo de cada vez, ou, em outras palavras, nenhuma simultaneidade. Ele pressupõe que uma solicitação não possa influenciar o desempenho de outra solicitação. Os recursos são compartilhados, como E / S de disco, largura de banda de rede, conjuntos de conexões, memória, ciclos de CPU, etc. Portanto, reduzir o uso de um recurso compartilhado por uma chamada de banco de dados pode impedir que outras solicitações diminuam a velocidade. Quando entrei para meu empregador atual, a gerência acreditava que ajustar uma consulta ao banco de dados de 3 segundos era uma perda de tempo. 3 segundos é tão pouco, por que perder tempo com isso? Não estaríamos melhor com uma CDN ou compactação ou outra coisa? Mas se eu puder executar uma consulta de 3 segundos em 1 segundo, digamos, adicionando um índice, que é 2/3 a menos de bloqueio, 2/3 a menos de tempo gasto ocupando um encadeamento e, mais importante, menos dados lidos no disco,
A teoria
Existe uma concepção comum de que o desempenho do software é simplesmente velocidade .
De uma perspectiva puramente de velocidade, você está certo. Um sistema é tão rápido quanto seu componente mais lento. Se você definiu o perfil do seu código e descobriu que a Internet é o componente mais lento, obviamente todo o resto não é a parte mais lenta.
No entanto, considerando o exposto, espero que você possa ver como a contenção de recursos, a falta de indexação, o código mal escrito etc. podem criar diferenças surpreendentes no desempenho.
As suposições
Uma última coisa. Você mencionou que uma chamada de banco de dados deve ser barata em comparação com uma chamada de rede do aplicativo para a API. Mas você também mencionou que o aplicativo e os servidores de API estão na mesma LAN. Portanto, os dois não são comparáveis às chamadas de rede? Em outras palavras, por que você está assumindo que a transferência da API é uma ordem de magnitude mais lenta que a transferência do banco de dados quando ambos têm a mesma largura de banda disponível? É claro que os protocolos e as estruturas de dados são diferentes, entendo isso, mas discuto a suposição de que são ordens de magnitude diferentes.
Onde fica murkey
Essa questão toda é sobre chamadas de banco de dados "múltiplas" versus "únicas". Mas não está claro quantas são múltiplas. Por causa do que eu disse acima, como regra geral, recomendo fazer quantas chamadas de banco de dados forem necessárias. Mas isso é apenas uma regra de ouro.
Aqui está o porquê:
- Os bancos de dados são ótimos na leitura de dados. Eles são mecanismos de armazenamento. No entanto, sua lógica de negócios reside em seu aplicativo. Se você estabelecer uma regra de que toda chamada de API resulta em exatamente uma chamada de banco de dados, sua lógica de negócios pode acabar no banco de dados. Talvez esteja tudo bem. Muitos sistemas fazem isso. Mas alguns não. É sobre flexibilidade.
- Às vezes, para obter uma boa dissociação, você deseja separar duas chamadas de banco de dados. Por exemplo, talvez toda solicitação HTTP seja roteada através de um filtro de segurança genérico que valide do banco de dados que o usuário tem os direitos de acesso corretos. Se o fizerem, continue executando a função apropriada para esse URL. Essa função pode interagir com o banco de dados.
- Chamando o banco de dados em um loop. Foi por isso que perguntei quantos são múltiplos. No exemplo acima, você teria 2 chamadas ao banco de dados. 2 está bem. 3 pode estar bem. N não está bem. Se você chamar o banco de dados em um loop, agora tornou o desempenho linear, o que significa que levará mais tempo quanto mais estiver na entrada do loop. Dizer categoricamente que o tempo de rede da API é o mais lento ignora completamente anomalias como 1% do seu tráfego, demorando muito tempo devido a um loop ainda não descoberto que chama o banco de dados 10.000 vezes.
- Às vezes, há coisas em que seu aplicativo é melhor, como alguns cálculos complexos. Pode ser necessário ler alguns dados do banco de dados, fazer alguns cálculos e, com base nos resultados, passar um parâmetro para uma segunda chamada de banco de dados (talvez para gravar alguns resultados). Se você combiná-las em uma única chamada (como um procedimento armazenado) apenas para chamar o banco de dados apenas uma vez, forçou-se a usar o banco de dados para algo em que o servidor de aplicativos possa ser melhor.
- Balanceamento de carga: você possui 1 banco de dados (presumivelmente) e vários servidores de aplicativos com balanceamento de carga. Portanto, quanto mais trabalho o aplicativo faz e menos banco de dados, mais fácil é dimensionar, porque geralmente é mais fácil adicionar um servidor de aplicativos do que configurar a replicação do banco de dados. Com base no marcador anterior, pode fazer sentido executar uma consulta SQL e, em seguida, fazer todos os cálculos no aplicativo, que é distribuído por vários servidores, e gravar os resultados quando terminar. Isso poderia proporcionar melhor taxa de transferência (mesmo que o tempo total da transação seja o mesmo).
TL; DR
TLDR: É realmente significativo se preocupar com várias chamadas ao banco de dados quando já estamos fazendo uma chamada de rede pela LAN? Se sim, por quê?
Sim, mas apenas até certo ponto. Você deve tentar minimizar o número de chamadas ao banco de dados quando for prático, mas não combine chamadas que não tenham nada a ver apenas com o objetivo de combiná-las. Além disso, evite chamar o banco de dados em um loop a todo custo.