Безопасно ли использовать домены на самом деле?
В принятом ответе на этот вопрос парень рекомендует не использовать домены с исключениями из них, потому что, по его словам, это вызовет утечки памяти и нестабильность. Но так я собирался использовать домены. Теперь я в замешательстве. Он прав?
2 ответа
В отличие от этого ответа, нет никакой гарантии, что это приведет к утечкам памяти и нестабильности. Но трудно гарантировать, что вы можете обработать исключение, не вызывая утечек памяти и нестабильности.
Я полагаю, что основа путаницы вокруг обработки исключений проистекает из этой формулировки из документации Node.js:
По самой природе того, как throw работает в JavaScript, почти никогда не существует способа безопасно "взять то, что вы остановили", без утечки ссылок или создания какого-либо другого неопределенного хрупкого состояния.
Самый безопасный способ отреагировать на возникшую ошибку - завершить процесс.
http://nodejs.org/api/domain.html
На самом деле, в JavaScript нет ничего особенного, что делает исключения особенно опасными. Дело в том, что исключения могут быть опасными на любом языке. Суть в том, чтобы тщательно продумать, какие побочные эффекты вызывает ваше приложение, и делаете ли вы что-либо, что может быть опасным, если оно остановится на полпути (подсказка: вы, вероятно, так).
В этом руководстве по дизайну от Joyent проводится различие между "ошибками программиста" и "операционными ошибками". В ответ на ваш вопрос, это руководство рекомендует не обрабатывать ошибки программиста (включая чтение свойства undefined), и утверждает, что, поскольку Domains и process.on('uncaughtException')
в первую очередь направлены на такие ошибки, их следует избегать.
Я думаю, что лучший способ использования доменов - это выявить ошибку. Также я рекомендую перезапускать процессы nodejs не реже одного раза в несколько часов. И используйте кластеризацию, чтобы у нас было несколько проектов nodejs, совместно использующих и обслуживающих один и тот же порт.