Как NodeJS обрабатывает несколько запросов GET от разных пользователей / браузеров? - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы знать, как NodeJS обрабатывает несколько запросов GET от разных пользователей / браузеров, для которых отправлено событие, возвращающее результаты?Я хотел бы думать об этом, как о том, что каждый раз, когда пользователь выполняет запрос GET, создается впечатление, что новый сеанс запускается для этого пользователя.

Например, если у меня есть этот запрос GET

var tester = require('./tester-class');

app.get('/triggerEv', async function(req, res, next) {
    // Start the data processing
    tester.startProcessing('some-data');

    // tester has event emitters that are triggered when processing is complete (success or fail)
    tester.on('success', function(data) {
        return res.send('success');
    }
    tester.on('fail', function(data) {
        return res.send('fail');
    }
}

Я думаю о том, что если я открою браузер и выполню этот запрос GET, передав some-data, и начну обработку.Затем откройте другой браузер, чтобы выполнить этот запрос GET с другими данными (чтобы симулировать одновременный доступ к нему нескольких пользователей), он перезапишет предыдущую функцию startProcessing и снова запустит ее с новыми данными.

Таким образом, если несколько пользователей выполнят этот запрос GET одновременно, будет ли он обрабатывать его отдельно для каждого пользователя, как если бы это были разные и независимые сеансы, а затем возвращаться, когда есть ответ для сеансов каждого пользователя?Или это будет делать, как я упоминал выше (в этом случае мне придется каким-то образом управлять различными сеансами для каждого пользователя, который запускает этот запрос GET)?

Я хочу сделать так, чтобы каждый пользователь, который выполняет этоЗапрос GET не мешает другим пользователям, которые одновременно выполняют этот запрос GET, и для каждого пользователя возвращается правильный ответ на основе его собственных данных, отправленных в функцию startProcessing.

Спасибо, янадеюсь, что я понимаю.Уточню если нет.

1 Ответ

1 голос
/ 25 июня 2019

Если вы разделяете глобальный объект tester между различными запросами, то второй запрос будет мешать первому запросу. Поскольку все входящие запросы используют одну и ту же глобальную среду в файле node.js, обычная модель состоит в том, что любой запрос, который может быть «на ходу» некоторое время, должен создавать свои собственные ресурсы и сохранять их для себя. Затем, если какой-либо другой запрос поступит, пока первый еще ожидает завершения чего-либо, он также создаст свои собственные ресурсы, и эти два не будут конфликтовать.

В серверной среде нет понятия «сеансы» в том смысле, в котором вы используете этот термин. Не существует отдельного сеанса сервера или состояния сервера, в котором каждый запрос живет, кроме объектов request и response, которые создаются для каждого входящего запроса. Это не похоже на PHP - для каждого запроса нет абсолютно нового состояния интерпретатора.

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

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

...