답변:
느린 클라이언트 동작과 구성에서이를 처리하는 방법에 중점을 두 겠지만 이것이 유일한 이점이라고 생각하지는 마십시오. 느린 클라이언트에 혜택을주는 것과 동일한 방법은 빠른 클라이언트, SSL 처리, 트래픽 급증 처리 및 인터넷에서 HTTP를 제공하는 다른 측면에도 이점이 있습니다.
Gunicorn은 프리 포킹 소프트웨어입니다. 로드 밸런서와 앱 서버 간 통신 또는 서비스 간 통신과 같은 대기 시간이 짧은 통신의 경우 프리 포크 시스템은 매우 성공적 일 수 있습니다. 요청을 처리하기 위해 프로세스를 가동하는 데 드는 비용은 없으며 단일 프로세스는 단일 요청을 처리하는 데 전념 할 수 있습니다. 이러한 것들을 제거하면 동시 연결 수가 처리 할 수있는 사용 가능한 프로세스 수를 초과 할 때까지 전체적으로 더 빠르고 효율적인 시스템으로 이어질 수 있습니다.
귀하의 상황에서는 인터넷을 통해 대기 시간이 긴 클라이언트를 다루고 있습니다. 이러한 느린 클라이언트는 동일한 프로세스를 연결할 수 있습니다. QPS가 중요한 경우 응용 프로그램 코드는 가능한 한 빨리 요청을 수신, 처리 및 해결하여 다른 요청으로 이동할 수 있어야합니다. 느린 클라이언트가 시스템과 직접 통신 할 때 해당 프로세스를 묶고 속도를 느리게합니다. 요청을 가능한 한 빨리 처리하고 처리하는 대신, 그 프로세스는 또한 느린 클라이언트를 기다려야합니다. 효과적인 QPS가 다운됩니다.
CPU 및 메모리 비용이 거의없는 많은 수의 연결을 처리하는 것이 Nginx와 같은 비동기 서버에 적합합니다. 많은 클라이언트를 동시에 처리하는 데 능숙하기 때문에 느린 클라이언트에 의해 동일한 부정적인 방식으로 영향을받지 않습니다. Nginx의 경우 최신 하드웨어에서 실행하면 한 번에 수만 개의 연결을 처리 할 수 있습니다.
프리 포킹 서버 앞의 Nginx는 훌륭한 조합입니다. Nginx는 클라이언트와의 통신을 처리하며 느린 클라이언트 처리에 대한 페널티를받지 않습니다. 백엔드가 해당 요청을 처리 할 수있는 한 빨리 백엔드로 요청을 보내서 백엔드가 서버 리소스를 최대한 효율적으로 사용할 수 있도록합니다. 백엔드는 결과를 계산하자마자 결과를 반환하고, Nginx는 응답 속도를 느리게하여 클라이언트를 자신의 속도로 느리게 보냅니다. 한편 백엔드는 느린 클라이언트가 여전히 결과를 수신하더라도 다른 요청을 처리 할 수 있습니다.
@blueben이 맞습니다. 리버스 프록시가 사용되지 않을 때 발생할 수있는 구체적이고 일반적인 예는 백엔드 데이터베이스가 프록시가없고 트래픽 스파이크가있는 데이터베이스 연결 핸들을 실행할 수 있다는 것입니다. @blueben에서 설명한대로 연결이 느리게 해제되기 때문입니다.
데이터베이스 핸들이 부족 해지는 것을 본 첫 번째 본능은 더 많은 데이터베이스 연결을 지원하는 것입니다. 그러나 앱 앞에 리버스 프록시를 추가하면 고부하에 필요한 데이터베이스 연결 수가 크게 떨어지고 안정화되는 것을 확인할 수 있습니다. 트래픽이 급증 할 때 데이터베이스 연결 수준은 거의 급증하지 않습니다.
Nginx는 또한 정적 콘텐츠, 캐싱 및 기타 다양한 HTTP 작업을 제공하여 앱 서버가 앱 서버에 집중할 수 있도록합니다.