【问题标题】:Is it safe to use domains actually?实际上使用域是否安全?
【发布时间】:2015-01-03 09:50:48
【问题描述】:

在对this question 的接受回答中,该人建议不要使用会引发异常的域,因为他说,这会导致内存泄漏和不稳定。但这是我打算使用域的方式。现在我很困惑。他说的对吗?

【问题讨论】:

    标签: node.js node.js-domains


    【解决方案1】:

    that answer 断言不同,不能保证它导致内存泄漏和不稳定。但很难保证您可以处理异常而不会导致内存泄漏和不稳定。

    我认为,异常处理混乱的核心源于 Node.js 文档中的以下措辞:

    由于 throw 在 JavaScript 中的工作原理,几乎没有任何方法可以安全地“从上次中断的地方继续”,而不会泄漏引用或创建其他类型的未定义脆弱状态。

    响应抛出的错误最安全的方法是关闭进程。

    http://nodejs.org/api/domain.html

    实际上,JavaScript 并没有什么特别之处可以让异常变得特别危险。事实上,异常在任何语言中都有潜在的危险。关键是要仔细考虑您的应用程序会导致什么副作用,以及如果中途停止,您是否正在做任何可能危险的事情(提示:您可能是)。

    This design guide from Joyent 区分“程序员错误”和“操作错误”。在回答您的问题时,本指南主张不要处理程序员错误(包括读取 undefined 的属性),并断言由于 Domains 和 process.on('uncaughtException') 主要针对此类错误,因此应该避免它们。

    【讨论】:

    • 我只想补充一点,域的目的是让您的进程有机会在发生错误时优雅地退出。由于 Node.js 应用程序通常在一个长时间运行的单个进程中运行,如果一个用户做一些意想不到的事情可能会影响到成千上万的其他人,那将是一场灾难。如果可能,域允许您注册错误、停止接受新请求并允许其他请求完成。如果您正在寻找一个抗错误的应用程序,您应该将域与cluster 模块结合使用,并且每次发生错误时,只需停止工作程序并生成一个新的。
    【解决方案2】:

    我认为使用域的最佳方法是找出错误。我还建议至少每几个小时重新启动一次 nodejs 进程。并使用集群,所以我们有许多 nodejs 项目在同一个端口上共享和服务。

    【讨论】:

    • 我不太明白你所说的追赶域是什么意思。
    • 域可以捕获相当严重的错误,标准 express-errorhandler 无法捕获 - 例如 - github.com/vodolaz095/hunt/blob/master/examples/… 对于错误报告的中间件,这只会使用 1 个退出代码停止应用程序
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多