2016-11-13 9 views
1

Вчера я давал некоторую презентацию на nodeJS. Некоторых один спросил меня следующий вопрос:Может ли два запроса HTTP собраться вместе? Если это возможно, как обрабатывает сервер nodeJS?

Как мы знаем nodeJS единственным сервер резьбовой, несколько запроса приходит на сервер, и он толкает весь запрос на цикл обработки событий. Что делать, если два запроса поступают на сервер в то же время, как сервер будет справиться с этой ситуацией?

Я угадал мысль и ответил обратно следующее:

Я думаю Нет запроса два HTTP не может прийти к серверу точно такой же время, все запросы приходят через одну розетку, чтобы они будет в очереди. Http запрос имеет следующий формат:

httpPctFormt

Отметка запроса содержится в его заголовок, и они могут быть прижаты к петле событий в зависимости от их временной метки в заголовке.

, но я не уверен, дал ли я ему правильный или неправильный ответ.

ответ

3

Я думаю запрос Нет два HTTP не может прийти к серверу в то же самое время, все запросы приходят через трубу, так что они будут в очереди.

Эта часть в основном правильная. Входящие соединения входят в очередь событий, и один из них должен быть помещен в очередь.

Что делать, если два запроса поступают на два сервера в одно и то же время, как сервер справится с этой ситуацией?

Поскольку сервер прослушивает входящие TCP-соединения в одном сокете в одном процессе, не может быть двух входящих соединений в одно и то же время. Одна из них будет обрабатываться базовой операционной системой немного раньше другой. Подумайте об этом так. Входящее соединение представляет собой набор пакетов по сетевому соединению. Одно из входящих соединений будет иметь свои пакеты перед другим.

Даже если у вас было несколько сетевых карт и несколько сетевых ссылок, так что два входящих соединения могли буквально прибыть на сервер в тот же самый момент, очередь node.js будет охраняться для параллелизма чем-то вроде мьютекса и одной из входящие соединения будут захватывать мьютекс перед другим и помещаться в очередь событий перед другим.

Тот, который обрабатывается ОС, сначала будет помещен в очередь событий node.js перед другим. Когда узел.js доступен для обработки следующего элемента в очереди событий, то, какой бы входящий запрос был первым в очереди событий, сначала начнется обработка.

Так как выполнение JS-узла node.js однопоточно, обработка этого запроса будет завершена с его синхронным кодом. Если он имеет операцию async, тогда он начнет эту операцию async и вернется. Затем будет разрешено обрабатывать следующий элемент в очереди событий, и код для второго запроса начнет работать. Он будет работать синхронно с завершением. Как и в случае с первым запросом, если он имеет операцию async, тогда он начнет эту операцию async и вернется.

В этот момент после того, как оба запроса запустили свои асинхронные операции, а затем вернулись, то это просто до очереди событий. Когда закончится одна из этих операций async, она отправит другое событие в очередь событий, и когда единственный поток node.js будет бесплатным, он снова обработает следующий элемент в очереди событий. Если оба запроса имеют множество асинхронных операций, их прогресс может чередоваться, и оба могут быть «в полете» одновременно с тем, как они запускают асинхронную операцию, а затем возвращаются до тех пор, пока эта асинхронная операция не завершится, когда их обработка снова забирается, когда node.js бесплатно обработать это следующее событие.

Отметка запроса содержится в его заголовке, и они могут быть толкнул в цикл обработки событий в зависимости от их временной метки в заголовке.

Эта часть не совсем прав. Входящие события того же типа добавляются в очередь по мере их поступления. Первые, чтобы прибыть, входят в очередь сначала - нет никакого шага, который исследует некоторую временную метку.

+0

Можно ли одновременно подключать сервер к нескольким сокетам?? Если это возможно, может быть несколько запросов одновременно? –

+0

@AkhileshKumar - Я не изучил все возможности с несколькими сетевыми картами, но вы можете иметь несколько слушателей, каждый на другой сетевой карте, но все в том же процессе node.js. – jfriend00

1

Несколько одновременных HTTP-запросов не являются проблемой. Node.js является асинхронным и будет обрабатывать несколько запросов в цикле событий, не дожидаясь завершения каждого из них.

Для справки, например: https://stackoverflow.com/a/34857298/1157037

+1

Но вы должны добавить, что вам нужно избегать длительных задач синхронизации. Во время обработки запроса, не считая операции async IO, сервер не может обрабатывать больше запросов. Мы должны позаботиться об этом. –