Node.js在生产环境中是绝对可行的,但与文档中承诺的“交钥匙”部署相去甚远。使用Node.js v0.6。X,“集群”已经集成到平台中,提供了一个基本的构建块,但我的“production.js”脚本仍然有大约150行逻辑来处理诸如创建日志目录,回收死去的工人等事情。对于一个“严肃的”生产服务,你还需要准备好限制传入的连接,并完成Apache为PHP所做的所有事情。公平地说,Ruby on Rails有这个确切的问题。它通过两个互补的机制来解决:1)把Ruby on Rails/Node.js放在一个专用的web服务器后面(用C编写并测试),比如Nginx(或Apache / Lighttd)。web服务器可以有效地提供静态内容、访问日志、重写url、终止SSL、执行访问规则和管理多个子服务。对于击中实际节点服务的请求,web服务器通过代理发送请求。2)使用像独角兽这样的框架来管理工作进程,定期回收它们,等等。我还没有找到一个看起来完全成熟的Node.js服务框架;它可能存在,但我还没有找到它,仍然在我的手卷“production.js”中使用~150行。
为什么不像其他人一样每个连接使用一个进程/线程?< / em >在Node.js中,一个新的连接只是一个非常小的堆分配。启动一个新进程需要更多的内存,在某些平台上需要1兆字节。但真正的成本是与上下文切换相关的开销。当你有10^6个内核线程时,内核必须做很多工作来确定接下来应该执行谁。为Linux构建O(1)调度器已经做了很多工作,但最终,单个事件驱动进程比10^6个进程竞争CPU时间要有效得多。此外,在过载条件下,多进程模型的行为非常糟糕,无法提供关键的管理和管理服务,特别是SSHD(这意味着您甚至无法登录到该机器以了解它到底有多糟糕)。
但是JavaScript不是很慢/不好/邪恶/恶魔的产物吗?< / em > JavaScript有一些奇怪的地方,但有“好的部分”有一个非常强大的语言,在任何情况下,JavaScript是客户端(浏览器)上的语言。JavaScript将继续存在;其他语言将其作为一种IL,世界一流的人才正在竞相开发最先进的JavaScript引擎。由于JavaScript在浏览器中的角色,大量的工程工作被投入到使JavaScript快速运行。V8是最新最好的javascript引擎,至少在这个月是这样。它在效率和稳定性方面都超过了其他脚本语言(看看你,Ruby)。随着微软、谷歌和Mozilla的庞大团队致力于这个问题,它只会变得更好,竞争构建最好的JavaScript引擎(它不再是JavaScript“解释器”,因为所有现代引擎都在底层进行大量JIT编译,解释只是作为执行一次代码的后备)。是的,我们都希望能够修复一些比较奇怪的JavaScript语言选择,但它真的没有那么糟糕。这门语言非常灵活,你实际上不是在编写JavaScript,而是在编写Step或jQuery——在JavaScript中,库定义了体验。要构建web应用程序,无论如何你都必须了解JavaScript,所以在服务器上使用它进行编码有一种技能组合的协同作用。它使我不再害怕编写客户端代码。
说到JavaScript,什么是“闭包”?< / em >——这是一种很花哨的说法,表示你在调用链上保留了词法范围内的变量。,)是这样的:
var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();