Узел JS несколько одновременных запросов к бэкэнд-API - PullRequest
2 голосов
/ 06 июня 2019

Это мой метод js backsnd API.

apiRouter.route('/makeComment')
        .post((req, res) => {

            consoleLogger.info("Inside makeComment API..");
            logger.info("Inside makeComment");

            let timestamp = new Date().getTime();

            let latestCommentID = timestamp.toString();

            console.log("comment ID generated is "+latestCommentID);


            res.json({
                                'makeComment': 'success',
                                'commentid':latestCommentID
                 });

        });

Теперь, если к этому API поступит несколько одновременных запросов, что произойдет?

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

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

Пожалуйста, дайте мне знать, если мое понимание верно?


Редактировать 1:

После того, как в течение некоторого времени гуглил, получил эту ссылку , которая ясно объясняет некоторые понятия.

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Вы можете получить одну и ту же метку времени на 2 одновременных звонках. Но не потому, что NodeJS или ваш сервер обслуживал запрос параллельно, а потому, что миллисекунда - это достаточно длительное время, чтобы ваш сервер мог обрабатывать много запросов за одну и ту же миллисекунду.

Многопоточный или Параллельный

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

Javascript - это однопоточная среда. И да, у него есть цикл обработки событий, в котором он ставит задачи в очередь и обрабатывает их по одной за раз. NodeJS (и веб-API в случае браузерных приложений Javascript) предлагают определенные асинхронные функции, такие как fs.writeFile или fetch, которые среда выполнения в сотрудничестве с ОС может выполнять в том же или другом потоке / ядре, а затем организовывать возврат результаты обратно в ваше приложение через обратные вызовы и обещания.

В вашем примере ваш обработчик (часть, начинающаяся с (req, res) => { ... }) состоит только из вызовов синхронизации. Так что, да, различные вызовы этого обработчика будут выполняться последовательно, один за другим. И хотя никакие два запуска этого обработчика действительно никогда не произойдут в одно и то же время , но они будут происходить очень быстро, и у вас, скорее всего, будут случаи, когда вы получите одно и то же значение в миллисекундах от объекта Date. Если у вас была доступная временная метка с более высоким разрешением (возможно, нано секунд) или если вашему обработчику потребовалось больше времени (например, вы запустили цикл for на миллиард итераций), тогда вы сможете более четко наблюдать за последовательным поведением .

Избегать блокирования (синхронизации) вызовов в однопоточных приложениях

Именно по этой причине вам не рекомендуется выполнять какие-либо операции синхронного ввода-вывода (например, fs.writeFileSync и т. Д.) На веб-сервере NodeJS, поскольку, пока один запрос выполняет блокирующую операцию ввода-вывода, все остальные запросы ожидают, поставлен в очередь в цикле событий.

Действительно хорошее видео о цикле событий Javascript; это должно осветить некоторые темы: https://www.youtube.com/watch?v=8aGhZQkoFbQ

2 голосов
/ 06 июня 2019

Здесь нет возможности параллелизма. Как вы правильно поняли, Node.js работает в однопоточной среде (если вы не используете cluster , рабочий API или другие связанные модули Node.js, которые облегчают IPC ). Таким образом, линия

let timestamp = new Date().getTime();

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

Однако Date.prototype.getTime() имеет разрешение только в миллисекундах, поэтому удаленно возможно, что обратный вызов в apiRouter.route('/makeComment').post() может последовательно вызываться циклом событий из двух ожидающих асинхронных запросов в течение одной миллисекунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...