Какой запрос NodeJS будет обслуживать первым, если он получит n запросов одновременно? - PullRequest
2 голосов
/ 20 июня 2020

Я работаю над NodeJS. Сомневаюсь, что если nodejs получает много запросов, он обрабатывает их один за другим в очереди. Но если он получает n запросов, например, скажем, 4 запроса достигли nodejs одновременно без какого-либо промежутка времени, то какой из них nodejs выберет первым для обслуживания? Каковы критерии и причина выбора любого запроса из множества запросов одновременно?

1 Ответ

1 голос
/ 20 июня 2020

Поскольку все четыре запроса прибывают в одно и то же физическое соединение rnet, один из пакетов запроса попадет туда раньше других. Поскольку пакеты сходятся на последнем маршрутизаторе перед вашим сервером, один из них будет обработан маршрутизатором немного раньше другого, и этот пакет прибудет на ваш сервер раньше другого. Затем этот пакет сначала попадет в стек TCP в ОС, которая сначала уведомит node.js об этом. Nodejs начнет обработку этого первого запроса. Поскольку основной поток в nodejs является однопоточным, если обработчик запроса не вызывает что-то асинхронное, он отправит ответ на первый запрос, прежде чем он сможет начать обработку второго запроса.

Если первый запрос имеет неблокирующие асинхронные части кода обработки запроса, тогда, как только он выполнит асинхронный вызов и вернет управление обратно событию nodejs l oop, второй запрос начнет обработку.

Но, если он получает n запросов, например, скажем, 4 запроса достигли nodejs одновременно без какого-либо промежутка времени, то какой из них nodejs выберет первым для обслуживания?

Это невозможно. Поскольку пакеты от каждого из запросов сходятся на последнем маршрутизаторе перед вашим сервером, они в конечном итоге будут упорядочены один за другим в соединении ethe rnet, подключенном к вашему серверу. Соединение ethe rnet не отправляет 4 запроса параллельно. Он отправляет пакеты один за другим.

Итак, ваш сервер увидит один из входящих пакетов раньше других. Кроме того, имейте в виду, что входящий HTTP-запрос - это не просто один пакет. Он состоит из установления TCP-соединения (с обратной связью), а затем клиент отправляет фактический http-запрос через установленное TCP-соединение. Если вы используете https, вам потребуется еще больше усилий для установления соединения. Таким образом, невозможно представить себе четыре входящих соединения, поступающих в один и тот же момент. Даже если бы это было так (представьте, что у вас есть четыре сетевые карты с четырьмя физическими подключениями к inte rnet), базовая операционная система в конечном итоге будет обслуживать одну из входящих сетевых карт раньше других. Будь то аппаратное прерывание на самом низком уровне или опрос l oop, одна из сетевых карт будет иметь входящие данные раньше других.

Каковы критерии и причина выбрать любой запрос из множества запросов одновременно?

Это не работает. ОС не сразу понимает, что у нее есть четыре запроса, которые поступили точно в один и тот же момент, и затем ей необходимо реализовать некоторый алгоритм, чтобы выбрать, какой запрос обслуживать первым. Так не работает. Вместо этого какой-то элемент оборудования / программного обеспечения низкого уровня (вероятно, в восходящем маршрутизаторе) будет принудительно упорядочивать входящие пакеты (либо на основе минутного времени, либо просто на основе того, как работает программное обеспечение - например, он проверяет аппаратный порт A, а затем аппаратный порт B и затем аппаратный порт C, например), и один физически поступит раньше другого на ваш сервер. Это не то, что должен решать ваш сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...