非堵塞的几个Web框架性能测试

有好事者将Tomcat7的Servlet-BIO与Servlet-NIO以及Node.js、Node.js-sync和Scala的Spray几个框架的性能测试,测试结果显示这几个框架的响应时间都差不多,这几个框架中有堵塞(Node.js-sync)和非堵塞(Node.js)两个方式,由此作者得出堵塞和非堵塞性能并没有多大区别。

测试结果见:bozho-benchmarks/nonblocking at master · Glamdring

点评:作者可能没有意识到非堵塞的真正意义,真正非堵塞是杜绝可能会产生堵塞的瓶颈,比如Socket IO是一个堵塞点,Socket IO在我们Web服务器中一般会存在两个地方,接受前端请求响应的Http服务器端,上面几个框架是这种Socket IO,还有一种是访问后端数据库的Socket IO。这两个容易堵塞点单独运行时可能没有什么问题,但是如果两个同时发生堵塞,容易陷入类似多线程的死锁状态,也就是说,一个线程已经通过Http的IO,等待DB的IO,而DB的IO已经被其他线程池连接被用光了,或者正在使用中,那么这个线程会停止等待,堵塞住了,因为它还hold住Http的IO线程,那么就会导致Http的IO堵塞,新的请求不再进来。

非堵塞实际是将每个单独线程能够顺利完成全部流程,消除中间可能发生的堵塞点。