Відповіді:
Я збираюся зосередитись на повільній поведінці клієнта та на тому, як працює Ваша конфігурація, але не спокушайтесь вірити, що це єдина перевага. Той самий метод, який приносить користь повільним клієнтам, також має переваги для швидких клієнтів, обробку SSL, боротьбу зі скачками трафіку та інші аспекти обслуговування HTTP в Інтернеті.
Gunicorn - це попередньо розвантажувальне програмне забезпечення. Для комунікацій із низькою затримкою, таких як балансир завантаження на сервер додатків або комунікація між службами, системи попередньої вилки можуть бути дуже успішними. Немає витрат на спінінг процесу обробки запиту, і один процес може бути присвячений обробці одного запиту; усунення цих речей може призвести до загальної швидшої та ефективнішої системи, поки кількість одночасних з'єднань не перевищить кількість доступних процесів для їх обробки.
У вашій ситуації ви маєте справу з клієнтами з високою затримкою через Інтернет. Ці повільні клієнти можуть пов'язати ті самі процеси. Якщо питання QPS має значення, код програми повинен отримувати, обробляти та вирішувати запит якомога швидше, щоб він міг перейти до іншого запиту. Коли повільні клієнти спілкуються безпосередньо з вашою системою, вони пов’язують цей процес і сповільнюють його. Замість того, щоб обробляти запит і розпоряджатися якомога швидше, цей процес тепер також повинен чекати повільного клієнта. Ефективна QPS знижується.
Робота з великою кількістю з'єднань з дуже невеликою витратою процесора та пам'яті - це те, чим добре допомагають асинхронні сервери типу Nginx. На них не впливають так само негативно, як повільні клієнти, оскільки вони вміло поводяться з великою кількістю клієнтів одночасно. У випадку з Nginx, працює на сучасному апаратному забезпеченні, він може обробляти десятки тисяч підключень одночасно.
Nginx перед сервером попереднього розгортання - чудове поєднання. Nginx обробляє спілкування з клієнтами і не несе штрафу за обробку повільних клієнтів. Він надсилає запити до бекенду так само швидко, як бекенд може обробляти ці запити, що дозволяє серверу бути максимально ефективним із ресурсами сервера, наскільки це можливо. Бекенд повертає результат, як тільки він обчислює його, і Nginx буферизує цю відповідь, щоб подати його, щоб сповільнити клієнтів у власному темпі. Тим часом, бекенд може перейти до обробки іншого запиту, навіть якщо повільний клієнт все ще отримує результат.
@blueben має рацію. Конкретний і поширений приклад того, що може статися, коли зворотний проксі-сервер не використовується, - це те, що база даних із заднім числом може запускати ручки підключення до бази даних, де немає проксі-сервера і є стрибок трафіку. Це пов'язано з повільним вивільненням з'єднань, як описано @blueben.
Перший інстинкт побачити, як закінчуються ручки бази даних, може бути підтримка більшої кількості підключень до бази даних. Але додавши зворотний проксі перед додатком, ви побачите кількість необхідних підключень до бази даних для високого навантаження, як значно знизиться, так і стабілізуйтесь - рівень з'єднання з базою даних не буде майже таким чином, коли є стрибок трафіку.
Nginx також чудово обслуговує статичний вміст, кешування та різноманітні інші завдання HTTP, дозволяючи вашому серверу додатків зосередитись на тому, щоб бути сервером додатків.