그러나 이것이 정말로 중요합니까? UI가 API를 네트워크 호출해야한다고 생각하십시오. 꽤 큽니다 (밀리 초 단위). 데이터베이스는 메모리에 내용을 보관하고 매우 빠르게 읽기를 실행하도록 최적화되어 있습니다 (예 : SQL Server는 모든 것을 RAM에로드 및 보관하고 가능한 경우 거의 모든 여유 RAM을 소비 함).
논리
이론적으로는 맞습니다. 그러나이 근거에는 몇 가지 결함이 있습니다.
당신이 언급 한 바에 따르면 실제로 앱을 테스트 / 프로파일 링했는지 확실하지 않습니다. 즉, 앱에서 API 로의 네트워크 전송이 가장 느린 구성 요소 라는 것을 실제로 알고 있습니까? 그것이 직관적이기 때문에, 그것을 추측하기가 쉽습니다. 그러나 성능을 논의 할 때 절대 가정해서는 안됩니다. 저는 고용주로서 성과 책임자입니다. 내가 처음 가입했을 때 사람들은 병목 현상이 무엇인지에 대한 직감을 바탕으로 CDN, 복제 등에 대해 계속 이야기했습니다. 우리의 가장 큰 성능 문제는 데이터베이스 쿼리의 성능 저하였습니다.
데이터베이스가 데이터를 검색하는 데 능숙하기 때문에 데이터베이스가 반드시 최고 성능으로 실행 중이고 최적으로 사용 중이며 개선하기 위해 수행 할 수있는 작업이 없다고합니다. 즉, 데이터베이스는 빠르도록 설계되었으므로 걱정할 필요가 없습니다. 또 다른 위험한 사고 방식. 그것은 자동차가 빠르게 움직인다는 의미이므로 오일을 바꿀 필요가 없습니다.
이 사고 방식은 한 번에 단일 프로세스를 가정하거나 동시성을 사용하지 않는 다른 방식을 가정합니다. 한 요청이 다른 요청의 성능에 영향을 줄 수 없다고 가정합니다. 디스크 I / O, 네트워크 대역폭, 연결 풀, 메모리, CPU주기 등과 같은 리소스는 공유됩니다. 따라서 한 데이터베이스 호출의 공유 리소스 사용을 줄이면 다른 요청이 느려지는 것을 방지 할 수 있습니다. 내가 현재 고용주에 처음 합류했을 때 경영진은 3 초 데이터베이스 쿼리 튜닝이 시간 낭비라고 믿었습니다. 3 초가 너무 적어서 왜 시간이 낭비됩니까? CDN이나 압축 또는 다른 방법으로 더 나아지지 않습니까? 그러나 인덱스를 추가하여 1 초 안에 3 초 쿼리를 실행할 수 있다면, 즉 블로킹 2/3, 스레드 점유에 소요되는 시간 2/3, 더 중요한 것은 디스크에서 읽는 데이터가 적습니다.
이론
소프트웨어 성능이 단순히 속도에 관한 것이라는 일반적인 개념이 있습니다 .
순전히 속도의 관점에서, 당신이 맞습니다. 시스템은 가장 느린 구성 요소만큼 빠릅니다. 코드를 프로파일 링하고 인터넷이 가장 느린 구성 요소라는 것을 알게되면 다른 모든 것이 가장 느린 부분은 아닙니다.
그러나 위의 내용을 감안할 때 리소스 경합, 인덱싱 부족, 잘못 작성된 코드 등이 성능에 놀라운 차이를 만드는 방법을 알 수 있기를 바랍니다.
가정
마지막 한가지. 데이터베이스 호출은 앱에서 API 로의 네트워크 호출에 비해 저렴해야한다고 언급했습니다. 그러나 앱과 API 서버가 동일한 LAN에 있다고 언급했습니다. 따라서 둘 다 네트워크 호출과 비슷하지 않습니까? 다시 말해, API 전송이 모두 사용 가능한 대역폭이 같을 때 데이터베이스 전송보다 수십 배 느리다고 가정하는 이유는 무엇입니까? 물론 프로토콜과 데이터 구조는 다르지만 그 정도는 다르다고 가정합니다.
어두워지는 곳
이 전체 질문은 "복수"대 "단일"데이터베이스 호출에 관한 것입니다. 그러나 얼마나 많은지 불분명합니다. 위에서 말한 것 때문에 일반적으로 경험에 따라 데이터베이스 호출을 적게하는 것이 좋습니다. 그러나 그것은 단지 경험의 법칙 일뿐입니다.
이유는 다음과 같습니다.
- 데이터베이스는 데이터를 잘 읽습니다. 그들은 스토리지 엔진입니다. 그러나 비즈니스 로직은 애플리케이션에 있습니다. 모든 API 호출로 인해 정확히 하나의 데이터베이스 호출이 발생한다는 규칙을 작성하면 비즈니스 논리가 데이터베이스에서 종료 될 수 있습니다. 어쩌면 괜찮습니다. 많은 시스템이 그렇게합니다. 그러나 일부는 그렇지 않습니다. 유연성에 관한 것입니다.
- 때때로 좋은 디커플링을 달성하기 위해 2 개의 데이터베이스 호출을 분리하려고합니다. 예를 들어, 모든 HTTP 요청은 일반 보안 필터를 통해 라우팅되며,이 보안 필터는 DB에서 사용자에게 올바른 액세스 권한이 있는지 확인합니다. 그렇다면 해당 URL에 적절한 기능을 계속 수행하십시오. 이 기능은 데이터베이스와 상호 작용할 수 있습니다.
- 루프에서 데이터베이스 호출 이것이 내가 몇 개인 지 물었던 이유입니다. 위의 예에서는 2 개의 데이터베이스 호출이 있습니다. 2는 괜찮습니다. 3 괜찮을 수도 있습니다. N은 좋지 않습니다. 루프에서 데이터베이스를 호출하는 경우 이제 성능이 선형이되었으므로 루프의 입력에있는 시간이 오래 걸릴 것입니다. 따라서 API 네트워크 시간이 가장 느리다는 말은 데이터베이스를 10,000 번 호출하는 아직 발견되지 않은 루프로 인해 오랜 시간이 걸리는 트래픽의 1 %와 같은 예외를 완전히 간과하는 것입니다.
- 때로는 복잡한 계산과 같이 앱이 더 나은 것들이 있습니다. 데이터베이스에서 일부 데이터를 읽고 계산을 수행 한 다음 결과를 기반으로 매개 변수를 두 번째 데이터베이스 호출에 전달해야합니다 (일부 결과 작성 가능). 데이터베이스를 한 번만 호출하기 위해 저장 프로 시저와 같은 단일 호출로 이들을 결합하는 경우 앱 서버가 더 나은 데이터베이스를 사용해야합니다.
- 로드 밸런싱 : 하나의 데이터베이스 (아마도)와 여러로드 밸런싱 된 응용 프로그램 서버가 있습니다. 따라서 앱이 수행하는 작업이 많고 데이터베이스가 적을수록 데이터베이스를 설정하는 것보다 일반적으로 앱 서버를 추가하는 것이 더 쉽기 때문에 확장하기가 더 쉽습니다. 이전 글 머리 기호를 기준으로 SQL 쿼리를 실행 한 다음 여러 서버에 분산 된 응용 프로그램에서 모든 계산을 수행 한 다음 완료되면 결과를 기록하는 것이 좋습니다. 전체 트랜잭션 시간이 동일하더라도 처리량이 향상 될 수 있습니다.
TL; DR
TLDR : LAN을 통해 이미 네트워크 호출을 할 때 여러 데이터베이스 호출에 대해 걱정하는 것이 정말로 중요합니까? 그렇다면 왜 그렇습니까?
예, 그러나 어느 정도까지만 가능합니다. 가능할 때 데이터베이스 호출 수를 최소화하려고하지만 서로 결합하기 위해 서로 관련이없는 호출을 결합하지 마십시오. 또한 모든 비용으로 루프에서 데이터베이스를 호출하지 마십시오.