Как nodejs позволяет повысить производительность http-запросов без многопоточности? - PullRequest
0 голосов
/ 05 июля 2018

Я много читал и смотрел много лекций на Youtube о цикле событий Nodejs и libuv, но я все еще не могу понять некоторые вещи: согласно этому слайду с лекции Youtube от одной из люди, стоящие за libuv:

enter image description here

http-запросы обрабатываются асинхронно, то есть они входят в цикл обработки событий один за другим и обрабатываются в значительной степени в порядке FIFO, насколько я понимаю, поскольку потоки не используются для параллельной обработки запросов. Но тогда как Nodejs может быть удаленным событием так же быстро, как эквивалентный многопоточный сервер Java (не говоря уже о самом быстром)? Есть ли что-то под libuv, которое выполняет эти запросы, используя потоки?

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

Также Javascript также использует libuv или только Nodejs использует его?

1 Ответ

0 голосов
/ 05 июля 2018

Javascript имеет только один поток, представьте себе, что Java servlet container работает с одним потоком. Единственное отличие состоит в том, что код JS ожидает, что вы освободите поток, если вы не будете активно обрабатывать (активно используя циклы ЦП) что-либо, в то время как Java будет ожидать, что вы заблокируете поток, пока не будете готовы вернуть ответ, даже если вы ждете IO (т.е. запрос БД)

Таким образом, когда мы говорим, что Nodejs способен обслуживать множество запросов, мы имеем в виду множество IO bound запросов, которые являются большинством реальных HTTP-запросов. Он не может выполнить любой многопоточный сервер с точки зрения обслуживания CPU bound запросов, что является неправильным вариантом использования для nodejs. В случае IO bound узел запросов просто продолжит помещать запросы в очередь, как только они перейдут на IO. Эти запросы имеют метод обратного вызова (для ответа ввода-вывода, т. Е. Вывода запроса БД), прикрепленный к ним для определенных событий, который проверяется во время цикла событий. Таким образом, во время выполнения цикла событий узел может иметь миллион запросов в очереди и не использовать ЦП ни для какого, если ни одно из событий еще не было запущено. Контейнер сервлета умрет, прежде чем обслужит 1 миллион запросов, потому что он не сможет идти в ногу с ресурсами, необходимыми миллиону потоков.

Теперь даже Servlet API имеет async возможности request.startAsync () , который освобождает поток контейнера при ожидании IO или любого другого события, освобождая потоки для обслуживания большего количества запросов.

...