Как Node.js обрабатывает одновременные запросы одним потоком?

Я сделал несколько поисков по этому вопросу, но кажется, что люди подчеркивают только неблокирующее IO.

Скажем, если у меня просто очень простое приложение для ответа на текст "Hello World" для клиента, для завершения выполнения все равно потребуется время, независимо от того, насколько быстро оно выполняется. Что делать, если в то же время поступают два запроса, как Node.js убеждаются, что оба запроса будут обработаны одним потоком?

Я прочитал блог Понимание цикла событий Node.js, в котором говорится: "Конечно, на сервере есть потоки и процессы для доступа к БД и выполнения процесса". Это утверждение относится к IO, но я также задаюсь вопросом, есть ли отдельный поток для обработки очереди запросов. Если это так, могу ли я сказать, что концепция единственного потока Node.js применима только к разработчикам, которые создают приложения на Node.js, но Node.js фактически работает на нескольких потоках за сценой?

Ответ 1

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

Если вы находитесь в системе * nix, вы можете использовать netstat для просмотра текущего количества байтов в очередях отправки и получения. В этом примере в очереди приема есть 0 байтов и 240 байтов в очереди отправки (ожидающих отправки ОС).

Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      240 x.x.x.x:22                 x.x.x.x:*                   LISTEN

В Linux вы можете проверить размер по умолчанию и максимально допустимый размер очередей отправки/получения с файловой системой proc:

Receive:

cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max

Send:

cat /proc/sys/net/core/wmem_max
cat /proc/sys/net/core/wmem_default