Web服务性能测试:Node.JS大胜基于Tomcat的REST服务

这次评测是评测Java REST、Java SOAP与Node.JS之间的性能对比,基于内存缓存的Web服务性能对比,对缓存中key/value数据进行插入 抓取 和删除。如下图:


Java REST技术采取的是 Apache Tomcat + Jersey;Java SOAP技术采取的是Tomcat + Apache Axis2(servlet),读取fetch和Insert两个读写操作结果如下图:




评测结果是Node.JS性能超过Tomcat为主的常用Java技术很多,个人观点,这次选择的是Java常用的Web服务器,因为其采取的是线程池技术,线程池技术会存在线程堵塞等待情况,但是Java完整异步的Netty/Vert.x又不是完整的Servlet服务器。

[该贴被banq于2014-02-12 11:03修改过]
[该贴被banq于2014-02-12 11:04修改过]
[该贴被admin于2014-02-15 16:13修改过]

这篇文章解释了为什么Node.js比java 的Tomcat快:
http://strongloop.com/strongblog/node-js-is-faster-than-java/

异步是指整个代码路径必须是非阻塞和异步,不只是在IO层。这就是Node.js的过人之处。


而Tomcat服务器的线程池总是存在线程等待情况,包括对数据库的堵塞访问(数据库连接池也是一种线程池,也存在堵塞)。




[该贴被banq于2014-02-12 11:13修改过]

池的作用一个是重复利用,一个是防止资源过度占用,比如说控制数据库连接在一定数量以内,达到这一数量,则需要进行等待,这样不至于系统崩溃。你这里不用池的情况下,怎么保证这种情况的?如果保证不了,那么这两者就没什么可比性。

2014-02-17 12:43 "@chanball"的内容
你这里不用池的情况下,怎么保证这种情况的 ...

我是这样理解的,这个堵塞可能还是由于两个线程池不协调引起的,一个请求过来以后,第一步从Servlet线程池获得一个线程,第二步处理业务,第三步通过数据库连接池存储数据。在第三步是需要再次获得数据库连接池的连接,但是因为处理业务时间长短不一,存储数据的耗时不等,不是说所有获得Servlet线程的请求能一路绿灯地也申请到数据库连接池的连接。

这如同你经过两个红绿灯路口都必须等待一样。而现在有的城市大道根据主行道大道逐个开启绿灯,一路绿灯,保障主行道通畅,这是很智慧的做法,可是这种办法无法用在指挥Servlet线程池和数据库连接池两个上面,也许通过异步是一种有效解决途径。

Servlet3.0和3.1分别加入了asynchronous servlet和asynchronous io,是不是和nodejs在原理上差不多了?上面的对比能找到代码吗?

2014-02-24 14:13 "@adaikiss"的内容
Servlet3.0和3.1分别加入了asynchronous servlet和asynchronous io,是不是和nodejs在原理上差不多了 ...

这样还不够,得将tomcat嵌入到应用中启动,也就是微服务那种。现在Servlet模型是Servlet服务在Tomcat中启动,首先启动Tomcat,这实际首先启动了两个线程池,然后我们启动Servlet服务,虽然有些Servlet是异步的,但是这个异步只是一种修复式的异步,不是Node.JS那种完全颠覆的异步。

将Socket IO的接受和发送根据需要启动,而不是事先启动准备好。这两种模式有本质区别。

现在Play框架有一种Reactive数据库连接池,大概能解决两个线程池互相制约的问题。