node.js 到底是什么?
node.js 是一个 js 的运行环境和 api 集合,为本来只能在浏览器沙盒中运行的 js 提供了与操作系统进行交互的能力,从此 js 也和其它的后台语言一样可以操作文件,监听网络端口,读写数据库,与操作系统底层交互了。
为什么要有 node.js 呢?
因为传统的同步模型的服务系统很难应对 C10K 问题,也就是很难设计出能轻松并发上万连接的服务端。node.js 通过提供原生的异步服务模型,能够轻松实现高并发服务器,从前需要各种优化才能实现的并发性能,现在 node.js 原生就能支持。
node.js 为什么能高并发?
要回答这个问题,首先要问为什么其它的同步模型的服务端为什么难以实现高并发?同步模型服务器在收到一个请求以后,就要创建一个新的线程来处理用户请求,这个线程有创建开销,运行时有内存占用,执行时对于文件操作和数据库读取需要阻塞后续代码,处理完请求之后需要再销毁相应线程,即使使用线程池来操作,也有线程切换开销,而且多线程编程对于开发者的心智要求也很高,很容易写出有问题的代码。所以,同步模型的时间开销和内存开销在并发量上来之后会线性增加,很快就会达到服务器无法支撑的地步,只有通过特殊优化才能支撑起高并发。
node.js 提供了大量的异步 api,使典型的服务端非阻塞 I/O 操作比如网络请求,文件读写,数据库读写等可以异步执行,I/O 的操作在底层的线程池进行,操作完成之后通知主线程,再由主线程处理网络请求。不用每一个请求来临时就创建一个新的线程,节省了线程创建和销毁的时间开销,也减少了内存的占用。有可能在低并发量的时候不如同步模型,但是在并发量高的时候,因为不会随着并发量的提高创建对应数量的线程,因此避免了很多创建线程的时间和线程占用的内存空间,这样就可以使用有限的服务器资源提供更高的并发性能了。