один поток nodejs? как это работает, если есть много одновременных запросов

Я новичок в nodejs, в настоящее время изучаю его. Я знаю, что nodejs является однопоточным, однако мне интересно: если я использую неблокирующий метод, например, есть 20000 одновременных запросов, и один запрос должен занимать много времени, другие потоки занимают меньше времени. Итак, как только мы встретим более длительный запрос, nodejs скажет: «Привет, пожалуйста, сделайте паузу, нужно использовать другой запрос», есть ли время по умолчанию для nodejs, чтобы определить, нужно ли его приостановить? Исправьте меня, если я использую неправильное слово «puase» (потому что я думаю, что, поскольку он однопоточный, он должен прекратить вычисления для одного запроса, если другой запрос хочет быть обработан.). В ситуации, которую я предполагал, более длинный запрос требует много времени для его обработки?

Спасибо за помощь.


person adiggo    schedule 17.10.2014    source источник
comment
Если тот, который занимает много времени, выполняет много синхронных действий, да, у вас будут проблемы, но если он асинхронный, например, чтение файла или запись в файл, другие запросы будут продолжать обрабатываться, ожидая завершения. асинхронное действие для завершения. javascript работает в цикле событий. По этой причине вам следует избегать использования синхронных действий в приложении node.js, которое обслуживает запросы.   -  person Kevin B    schedule 17.10.2014
comment
@KevinB да, я понимаю, что другие будут обработаны, если я использую асинхронный режим. Но мой вопрос в том, что, поскольку он однопоточный, если вы обрабатываете другой запрос, он занимает меньше времени, в течение этого времени более длительный запрос не обрабатывается в течение этого времени. Поправьте меня, если я ошибаюсь. Тогда есть много запросов на более короткое время, которые приведут к тому, что запрос на более длительное время не прецессируется. И нужно больше времени, чтобы закончить более длинный запрос. Это правильно?   -  person adiggo    schedule 17.10.2014
comment
Вот аналогия. Node.js — король. Он сидит на своем троне, а слуги приходят с просьбами и ждут ответов. Король слышит только один запрос за раз и отвечает только один раз за раз. Однако у него много слуг, которые выполняют его работу. Слуга А входит сразу же, за ним слуга Б. Король слушает слугу А, а затем отправляет его за кофе. Затем он слушает слугу Б и отправляет его открыть окно. Если слуга B вернется раньше слуги A, слуга B будет уволен первым, в то время как король все еще ждет слугу A. Когда слуга A вернется, король уволит его 2.   -  person Kevin B    schedule 17.10.2014
comment
Одновременно может обрабатываться множество запросов, но только один из них будет получен или на него будет дан ответ за раз.   -  person Kevin B    schedule 17.10.2014
comment
@KevinB Я понимаю, что вы имеете в виду, один поток предназначен для ввода-вывода. Но не для внутренней обработки. Аналогия отличная. Спасибо   -  person adiggo    schedule 17.10.2014
comment
Почему отрицательные голоса? Тот факт, что ОП не понимает, как работает node.js, недостаточен, чтобы проголосовать против. Мне кажется, это правильный вопрос. +1   -  person Maroshii    schedule 17.10.2014
comment
актуально и для меня, +1 @adiggo, так держать!   -  person pedrommuller    schedule 17.10.2014
comment
@Maroshii, спасибо, ребята   -  person adiggo    schedule 17.10.2014
comment
См. также: Что такое тик цикла событий Node.js   -  person josh3736    schedule 18.10.2014


Ответы (1)


Это правда, что node.js может получать или отвечать только на один запрос за раз, однако он может обрабатывать несколько запросов одновременно.

Например, предположим, что у вас есть приложение node.js, которое является остальным API, и каждый запрос приводит к вызову базы данных, за исключением конечной точки C. Остальные API имеют 3 конечных точки.

Конечная точка A: требуется 3 секунды, чтобы поговорить с базой данных

Конечная точка B: требуется 2 секунды, чтобы поговорить с базой данных

Конечная точка C: не взаимодействует с базой данных, она просто возвращает статический текст.

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

Теперь предположим, что у нас одновременно происходит 10 запросов в следующем порядке:

АВСВССКААБК

Вот как они будут получены и как на них ответят:

REC:A
REC:B
REC:C
RESP:C
REC:B
REC:C
RESP:C
REC:C
RESP:C
REC:A
REC:A
REC:B
REC:C
RESP:C
// 2 seconds later
RESP:B
RESP:B
RESP:B
// 1 second later
RESP:A
RESP:A
RESP:A

C всегда происходит немедленно, потому что он не выполняет никаких асинхронных действий. Затем вы получаете все B, а затем все A, потому что B быстрее, чем A.

Порядок B и A может различаться в зависимости от настройки базы данных, например, если она настроена на обработку только x запросов за раз.

Если мы ввели и конечную точку D, которая выполняет синхронное действие, которое занимает 6 секунд, вы получите такой результат:

АДАБК

REQ:A
REQ:D
// 6 long seconds later...
RESP:D
REQ:A
REQ:B
REQ:C
RESP:C
// 2 seconds later...
RESP:B
// 1 second later...
RESP:A
RESP:A

потому что D останавливает всю обработку javascript, пока происходит синхронное действие. 1 конечная точка, которая выполняет синхронное действие, является легкой точкой отказа для кого-то, кто может остановить ваш API.

person Kevin B    schedule 17.10.2014
comment
Отлично. Я понимаю. Но у меня есть вопрос. В чем преимущество перед другим языком, использующим новый поток после поступления нового запроса? Я вижу разницу в части ввода-вывода. Но в чем преимущество - person adiggo; 18.10.2014
comment
На это я не думаю, что действительно могу ответить, и в любом случае я сомневаюсь, что это сухой ответ, поскольку у каждого метода есть свои преимущества/недостатки. - person Kevin B; 18.10.2014
comment
да ты прав. Но я вижу, что многие люди говорят, что это позволит избежать состояния гонки. не тратьте время на тупиковые ситуации. Но все же я думаю, что внутри могут быть условия гонки, поскольку внутренняя обработка для каждого запроса все еще выполняется одновременно. - person adiggo; 18.10.2014
comment
конечно, могут быть условия гонки, если вы не кодируете правильно. Судя по тому небольшому опыту, который у меня есть с API-интерфейсом node.js по сравнению, скажем, с coldfusion, API-интерфейсы node.js гораздо более многословны, мне нужно на самом деле кодировать гораздо больше частей, чтобы все это работало (конечно, есть модули, которые сделайте это и для вас, например, экспресс и петля.) - person Kevin B; 18.10.2014
comment
Также имейте в виду, что то, что node.js является однопоточным, не означает, что вы не можете использовать несколько потоков для одного приложения. Например, я запускаю свой API в кластере из 4, по одному на процессор. Запросы автоматически распределяются между 4 приложениями, и, поскольку я использую таблицу БД для управления сеансом, все 4 могут получить доступ к данным сеанса. Если ваша база данных находится на отдельном сервере, вы можете легко добавить дополнительные серверы (за балансировщиком нагрузки), на которых будет работать больше кластеров, ничего не меняя. - person Kevin B; 18.10.2014
comment
@KevinB вау, да, верно. Я только начал изучать nodejs, он действительно многословен по сравнению с другими. Также хорошим примером является ваш пример разных кластеров. - person adiggo; 18.10.2014