Назад | Перейти на главную страницу

Становятся ли ответы сервера последовательными при параллельных запросах?

Пусть у нас есть веб-приложение, обслуживаемое Nginx, которое прослушивает порт 80.

Когда два или более пользователей пытаются получить доступ к URL-адресу приложения, ответ на который занимает много времени. Например, десять пользователей пытаются загрузить /give_me_some_charts страницы и ответы сервера в 100 секунд для однопользовательского запроса.

Каждый пользователь пытается получить доступ к приложению через порт. 80. Я считаю, что сервер (Nginx в нашем примере) должен заблокировать этот порт до тех пор, пока не будет отправлен ответ. Таким образом, обработка десяти пользователей займет 10 users * 100 seconds == 1000 seconds.

Но в Nginx есть функция, которая называется балансировка. И теперь я не уверен, как сервер обрабатывает параллельные запросы.

Итак, как сервер обрабатывает параллельные запросы и как он отвечает? И что это за функция балансировки Nginx?

Я не уверен насчет nginx конкретно (у меня еще не было причин его использовать), но почти все серверы, которые предоставляют службу для функции порта, аналогичной приведенной ниже:

  • Процесс слушателя открывает порт и ждет соединений
  • Как только новое соединение установлено, это соединение (сокет) передается другому процессу или потоку.
  • «Основной» процесс возвращается к ожиданию следующего подключения.

Сервер не будет блокировать все дальнейшие соединения, пока не закончит с текущим. Если бы это произошло, даже умеренно загруженные веб-сайты стали бы непригодными для использования. Блок кода, описанный выше, обычно является максимально компактным (маленьким), поэтому он завершается как можно быстрее. На некоторых серверах, которые формируют новые процессы (например, Apache), также будут висеть запасные «дочерние» процессы, чтобы им не приходилось выполнять медленную работу. fork системный вызов при подключении клиента.

Это позволяет одновременно подключать несколько (десятки, сотни, возможно, даже тысячи) клиентов. Если 10 пользователей подключаются к вашему веб-сайту, то веб-сервер имеет 10 отдельных потоков или процессов, обслуживающих этих клиентов одновременно. Завершаются ли все запросы за 100 секунд или занимают больше времени, в основном зависит от того, что делает код. (Борются ли они за процессорное время, блокировку файловой системы или вызовов базы данных и т. Д.)

Быстрый поиск в Интернете предполагает, что функция «балансировки» nginx может быть связана с его способностью передавать запросы к внутренним серверам (используя его в качестве балансировщика нагрузки), а не с его способностью обрабатывать несколько клиентов одновременно.