Node为什么更适合IO密集
Node为人津津乐道的就是它更适合
IO密集型 的系统, 并且具有
更好的性能 , 关于这一点其实与它的异步IO息息相关。对于一个request而言, 如果我们依赖io的结果, 异步io和同步阻塞io(每线程/每请求)都是要等到io完成才能继续执行. 而同步阻塞io, 一旦阻塞就不会在获得cpu时间片, 那么为什么异步的性能更好呢?
其根本原因在于同步阻塞Io需要为
每一个请求创建一个线程 , 在Io的时候, 线程被block, 虽然不消耗cpu, 但是其本身具有内存开销,
当大并发的请求到来时, 内存很快被用光, 导致服务器缓慢 , 在加上,
切换上下文代价也会消耗cpu资源 。而Node的异步Io是通过事件机制来处理的, 它不需要为每一个请求创建一个线程, 这就是为什么Node的性能更高。特别是在Web这种IO密集型的情形下更具优势, 除开Node之外, 其实还有另外一种事件机制的服务器Ngnix, 如果明白了Node的机制对于Ngnix应该会很容易理解, 有兴趣的话推荐看这篇文章。
总结
在真正的学习Node异步IO之前, 经常看到一些关于Node适不适合作为服务器端的开发语言的争论, 当然也有很多片面的说法。
其实, 关于这个问题还是取决于你的业务场景。
假设你的业务是cpu密集型的, 那你采用Node来开发, 肯定是不适合的。 为什么不适合? 因为Node是单线程, 你被阻塞在计算的时候, 其他的事件就做不了, 处理不了请求, 也处理不了回调。
那么在IO密集型中, Node就比Java好吗? 其实也不一定, 还是要取决于你的业务。 如果你的业务是非常大的并发, 但是你的服务器资源又有限, 就好比现在有个入口, Node可以一次进10个人, 而Java依次排队进一个人, 如果是10个人同时进, 当然是Node更具有优势, 但是假设有100个人(如1w个异步请求之类)的话, 那么Node就会因为它的异步机制导致应用被挂起,内存狂飙,IO堵塞,而且不可恢复,这个时候你只能重启了。而Java却可以有序的处理, 虽然会慢一点。 而一台服务器挂了造成的线上事故的损失更是不可衡量的。(当然, 如果服务器资源足够的话, Node也能处理)。
最后, 事实上Java也是具有异步IO的库, 只是相对来说, Node的语法更自然更贴近, 也就更适合。









