首先,Node.js不是多线程的。这很重要。设计能够在线程环境中完美运行的程序需要非常有才华的程序员。线程很难。
你必须成为一个神来维护一个没有被正确设计的线程化项目。在非常大的项目中只会有太多的问题难以避免。
其次,整个平台的设计初衷就是异步运行。你见过每个IO交互都是异步的ASP.NET项目吗?简单地说,ASP.NET并不是为事件驱动而设计的。
接着,由于我们每个打开的连接都有一个线程,加上整个扩展问题,就会导致内存占用问题。我可能错了,但我不知道如何避免在ASP.NET中为每个连接创建一个新线程。
另一个问题是当Node.js请求没有被使用或等待IO时它是空闲的。另一方面,C#线程休眠。现在,这些线程可以休眠的数量是有限制的。在Node.js中,你可以轻松地在同一开发机上并行处理10k个客户端。你试着在同一开发机上并行处理10k个线程。
JavaScript本身作为语言使异步编码更容易。如果你仍在使用C# 2.0,那么异步语法就是真正的痛苦。很多开发人员会因为你到处定义Action <>和Function<>并使用回调而变得混乱。一个以事件方式编写的ASP.NET项目对于普通的ASP.NET开发人员来说只是难以维护。
至于线程和核心。Node.js是单线程的,并通过创建多个节点进程来进行扩展。如果你有16个核心,那么你可以运行16个node.js服务器实例,并在其前面放置一个单一的Node.js负载平衡器。(如果需要,可以使用nginx负载平衡器)。
这全部都是从最低层次上设计到平台上的。这不是在后来添加的功能。
其他优点
Node.js不仅仅是以上内容。以上只是说明为什么Node.js处理事件循环的方式比使用ASP.NET异步能力更好。
- 性能方面,它非常快。
- Node.js最大的优点之一是其低级API。你有很多控制权。
- 整个HTTP服务器直接集成到你的代码中,而不是外包给IIS。
- 你可以进行整个nginx与Apache的比较。
- 整个C10K挑战对Node来说处理得很好,但对IIS则不行。
- AJAX和JSON通信感觉自然且容易。
- 实时通信是Node.js的一大亮点。它就是为此而生。
- 与基于文档的nosql数据库相匹配。
- 也可以运行TCP服务器。可以进行文件写入访问,可以在服务器上运行任何Unix控制台命令。
- 使用JavaScript查询数据库,例如CouchDB和map/reduce。客户端也可以用JavaScript编写。在开发Web堆栈时没有上下文切换。
- 富集的社区驱动开源模块。Node.js中的所有东西都是开源的。
- 占用空间小,几乎没有依赖项。你可以自己构建node.js源码。
Node.js的缺点
它很难。它还很年轻。作为一个有经验的JavaScript开发者,我在使用Node.js编写网站时感到困难,只是因为它低级特性以及我所拥有的控制水平。它感觉就像C语言。有很多灵活性和强大的功能,但也可能用来伤害我。
API并不稳定。它正在快速变化中。我可以想象,在5年内完全重写一个大型网站,因为Node.js将在那时被改变了许多。这是可做的,你只需知道维护Node.js网站不便宜。
进一步阅读
理解 Node.js 的事件循环
深入了解 Node.js
Node.js 指南