Подтвердить что ты не робот

Node.js надежность для большого применения

Я новичок в Node.js и в настоящее время сомневаюсь в его надежности.

Основываясь на том, что я видел до сих пор, похоже, существует серьезный недостаток: любая неперехваченная ошибка/исключения сбой сервера. Конечно, вы можете попытаться защитить свой код или поставить try/catch в ключевые области, но почти всегда будут ошибки, которые проскальзывают через трещины. И кажется опасным, если один проблемный запрос может повлиять на все остальные запросы. Есть два обходных пути, которые я нашел:

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

  • Поймать исключенные исключения с помощью process.on('uncaughtException'). Проблема с этим подходом (насколько я знаю) заключается в том, что нет способа получить ссылку на запрос, который вызывает исключение. Так что конкретный запрос остается висящим (пользователь видит индикатор загрузки до таймаута). Но, по крайней мере, в этом случае другие не-проблемные запросы все равно могут быть обработаны.

Может ли какой-нибудь Node.js ветеран в?

4b9b3361

Ответ 1

Для автоматического перезапуска и балансировки нагрузки я предлагаю вам проверить Learnboost up balancer.

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

Вы можете адаптировать эту стратегию так же, как и событие uncaughtException.

Ответ 2

У вас есть полный контроль над базовым процессом, и это функция.

Если вы сравниваете Node с установкой Apache/PHP, последняя действительно эквивалентна простому серверу Node, который отправляет каждый входящий запрос в свой собственный процесс, который заканчивается после обработки запроса.

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

Node - очень гибкий инструмент, который хорош, если вам нужна эта гибкость, но для этого требуется некоторое умение.

Ответ 3

Исключения не приводят к сбою сервера, они вызывают исключения.

Ошибки в node.js, которые уничтожают весь процесс, - это другая история.

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

Ответ 4

Неперехваченное исключение, если не поймано, приведет к краху сервера. Что-то вроде вызова функции с ошибками. Я использую process.on('uncaughtException') для захвата таких исключений. Если вы используете это, то да, ошибка, отправленная на process.on('uncaughtException'), менее информативна.

Я обычно включаю модуль, например nomnom, чтобы использовать флаги командной строки. Я включаю один под названием --exceptions, который, когда установлен, обходит process.on('uncaughtException'). В принципе, если я вижу, что происходят неперехваченные исключения, я в разработке запускаю приложение с --exceptions, чтобы при поднятии этой ошибки он не был захвачен, что приводит к тому, что Node выплевывает трассировку стека, а затем умереть. Это говорит вам, в какой строке это произошло, и в каком файле.

Захват исключений - один из способов борьбы с ним. Но, как вы сказали, это означает, что если произойдет ошибка, это может привести к тому, что пользователи не получат ответы и т.д. Я бы на самом деле рекомендовал разрешить ошибку сбой сервера. (Я использую process.on('uncaughtException') в приложениях, а не webservers). И используя forever. Дело в том, что, скорее всего, лучше для веб-сервера сбой, а затем выставить то, что вам нужно исправить.

Скажем, вы использовали PHP вместо Node. PHP не вызывает крушения сервера (поскольку он действительно не работает). Он выплескивает действительно уродливые ошибки. Несомненно, это не приводит к тому, что весь сервер падает, а затем возвращается. Никто не хочет, чтобы их клиенты имели время простоя. Но это также означает, что проблема будет сохраняться и будет менее заметной. Мы все видели сайты, которые произносили ошибки, и они не получают исправления очень быстро. Если бы такая ошибка должна была забрать все на один небольшой щелчок (что, честно говоря, не все так плохо в увеличенной картине), то он, несомненно, привлечет внимание к себе. Вы бы увидели, что это произойдет, и будет отслеживать эту ошибку.

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