iisnode сбой запросов после исключения под Windows?

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

Короче:

Я настроил iisnode, чтобы иметь 4 рабочих процесса (в web.config есть настройка для этого параметра nodeProcessCountPerApplication="4"). И это уравновешивает нагрузку между этими работниками.

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

Например:

worker 1 handling request 1, request 5 waiting 
worker 2 handling request 2, request 6 waiting
worker 3 handling request 3, request 7 waiting
worker 4 handling request 4, request 8 waiting

Если при обработке запроса 3 происходит исключение, сервер отвечает с моим пользовательским кодом ошибки, выключается и перезапускается iisnode. Но проблема в том, что запрос 7 также не выполняется, даже если он не был обработан.

Я пытался установить maxConcurrentRequestsPerProcess="1" так что только один запрос отправляется за один раз одному работнику, но он не работает так, как я хочу. Запрос 5,6,7,8 будет отклонен с ответом 503 Service Unavailable, даже если максимальное число запросов, которые будут помещены в очередь, установлено равным 1000 (по умолчанию iis).

Вопрос

Эти запросы не имеют ничего общего друг с другом, поэтому один сбой не должен снимать другой.

Есть ли в IIS параметр, позволяющий мне вести себя так же? Или это вообще возможно сделать с узлом и IIS?

В длинном

Зачем?

Я использую нод, потому что у меня есть некоторые другие требования (такие как логирование и т. Д.), Которые я могу выполнить в JavaScript довольно легко. Поскольку у меня есть фон ASP.NET MVC и я запускаю Windows, после нескольких поисков я нашел модуль iisnode для IIS, который можно использовать для размещения приложения узла с IIS. Это облегчает мне управление и развертывание приложения. Я также читал на многих сайтах, что серверы узлов имеют хорошую производительность из-за их асинхронного характера.

Как?

Я начал с очень простой логики обработки исключений, которая перехватывает исключения, используя объект домена узла:

var server = http.createServer(function (request, response) {
    var d = domain.create();
    d.on('error', function (err) {
        try {
            //stop taking new requests.
            serverShutdown();
            //send an error to the request that triggered the problem
            response.statusCode = 500;
            response.end('Oops, there was a problem! ;) \n');
        }
        catch (er2) {
            //oh well, not much we can do at this point.
            console.error('Error sending 500!', er2.stack);
            process.exit(1);
        }
    });

    d.add(request);
    d.add(response);

    d.run(function () {
        router.route(request, response);
    });
}).listen(process.env.PORT);

Так как я не смог найти никаких рекомендаций по корректному завершению работы сервера, когда есть необработанное исключение, я решил написать свою собственную логику. Так после server.close() называется, я иду через сокеты, и разбудить их, чтобы сервер мог завершить работу:

function serverShutdown() {
    server.close();
    for (var s in sockets) {
        sockets[s].setTimeout(1, function () { });
    }
}

Это тоже здорово!

Какие?

Проблема возникает, когда я пытаюсь это проверить. По некоторым причинам модуль кластера не поддерживается iisnode, но у него есть аналогичная функция. Я настроил iisnode, чтобы иметь 4 рабочих процесса (в web.config есть настройка, которая называется nodeProcessCountPerApplication="4"). И это уравновешивает нагрузку между этими работниками.

Я не совсем уверен, как это работает, но вот что я понял из тестирования:

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

Например:

worker 1 handling request 1, request 5 waiting 
worker 2 handling request 2, request 6 waiting
worker 3 handling request 3, request 7 waiting
worker 4 handling request 4, request 8 waiting

Если при обработке запроса 3 происходит исключение, сервер отвечает с моим пользовательским кодом ошибки, выключается и перезапускается iisnode. Но проблема в том, что запрос 7 также не выполняется, даже если он не был обработан.

Я пытался установить maxConcurrentRequestsPerProcess="1" так что только один запрос отправляется за один раз одному работнику, но он не работает так, как я хочу. Запрос 5,6,7,8 будет отклонен с ответом 503 Service Unavailable, даже если максимальное число запросов, которые будут помещены в очередь, установлено равным 1000 (по умолчанию iis).

Вопрос снова

Эти запросы не имеют ничего общего друг с другом, поэтому один сбой не должен снимать другой.

Есть ли в IIS параметр, позволяющий мне вести себя так же? Или это вообще возможно сделать с узлом и IIS?

Любая помощь приветствуется!


Обновить

Мне удалось исключить iisnode, и сделал тот же сервер, используя кластерные и рабочие процессы.

Проблема все еще сохраняется, и запрос, находящийся в очереди к работнику, у которого есть исключение, возвращается с 502 Bad Gateway.

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

Кто-нибудь может указать мне правильное направление? По крайней мере, где искать решение?

0 ответов

Другие вопросы по тегам