Nodejs eventl oop архитектура запроса-ответа для отправки нескольких ответов на несколько запросов клиентов - PullRequest
2 голосов
/ 01 августа 2020

Я изучаю структуру nodejs и пришел к событию l oop и модели архитектуры запрос-ответ. В соответствии с документацией и несколькими статьями. Как событие l oop обрабатывает неблокирующую операцию и делегирует операцию блокировки внутреннему пулу потоков, а при выполнении операции thread fini sh они готовят ответ в обратном вызове и переходят в основной стек где событие l oop обрабатывает ответ и отправляет обратно клиенту. Он указывает, есть ли у нас задачи, для которых требуется ЦП вместо операции с базой данных или файла (ввода-вывода), наш код будет в заблокированном состоянии (так как для решения потребуется время). Если мы завернем эту тяжелую задачу в обещание, как мы это делаем в интерфейсе javascript (браузер позаботится о функции исполнителя). Будет ли это хорошей практикой или я ищу неправильное решение? Я знаю, что это не операция ввода-вывода. и еще одно сомнение: главный поток fini sh вызывает выполнение операции ввода-вывода и отправляет ответ клиенту, не замедляет ли это процесс, если есть несколько ответов, подготовленных для отправки обратно клиенту, поскольку он блокирует основной поток?

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

Нет, обработка тяжелой задачи ЦП в Promises не помогает справиться с блоком основного потока ни в Node.js, ни в браузерах.

Если мы завернем эту тяжелую задачу в обещание, как мы во внешнем интерфейсе javascript (браузер позаботится о функции исполнителя)

Извините, но мы не «оборачиваем эту тяжелую задачу в обещания» ни в браузерах, если вы сделали это, и вы обнаружили, что HUD браузера не был заблокирован, возможно, вы сделали это с не так тяжелой задачей.

Правильные инструменты для решения тяжелых задач ЦП являются:

Fini основного потока sh вызывает выполнение операции ввода-вывода и отправляет ответ клиенту, не замедляет ли это процесс, если есть несколько ответов, подготовленных для отправки обратно клиенту, поскольку он блокирует основной поток?

При большом количестве одновременных запросов / ответов да, но мы говорим об очень v Очень большое количество одновременных запросов / ответов.

0 голосов
/ 03 августа 2020

Если ваше приложение однопользовательское, то есть несколько запросов не поступают, тогда хорошо использовать обещание / callback / asyn c -await. Это потому, что NodeJs будет выполнять асинхронные операции в фоновом режиме, и вам не нужно беспокоиться о параллелизме, потому что приложение основано на однопользовательском.

Если ваше приложение многопользовательское, как веб-приложение, тогда лучше для запуска отдельного процесса из основной запущенной программы (вашего приложения), то есть для создания рабочего потока. Это связано с тем, что если два разных клиента запрашивают операцию с интенсивным использованием ЦП, ваша основная программа не зависнет, и оба запроса будут обрабатываться одновременно. Однако им немного сложно управлять, и он будет стоить дорого. Интересно то, что в книге я изучал, что процесс веб-сервера создает новый поток для каждого нового входящего запроса, чтобы создать новый сокет TCP. Этот сокет используется для однозначной идентификации этого запроса.

0 голосов
/ 03 августа 2020

Асинхронный запуск кода (без рабочих потоков) не поможет повысить производительность, поскольку он будет помещен в очередь обратного вызова. Очередь обратных вызовов содержит все обратные вызовы, ожидающие выполнения, и все они выполняются в одном потоке. Для большинства веб-приложений узкое место не в событии l oop, но если у вас есть задачи, интенсивно потребляющие ЦП, и вы хотите использовать преимущества всех ядер ЦП, вам следует рассмотреть одно из следующего:

  • Запустите по одному экземпляру Node.js на ядро ​​и настройте балансировщик нагрузки на его основе (имейте в виду, что машине по-прежнему требуется некоторый ЦП для Node.js внутренних асинхронных функций, другое программное обеспечение работает на той же машине , и это переключение контекста порождает контрпродуктивные накладные расходы)
  • Используйте рабочие потоки (доступно в v10.5.0 ) и используйте их функции обмена сообщениями для их синхронизации
...