Web服务性能测试:Node完胜Java


发布者 ourjs  发布时间 1392123793000
关键字 技术前沿 
简介

我最近做了一些简单的关于内存的Web Service性能测试。我使用Java(REST + SOAP)和Node.js(REST)将一些接口功能缓存起来。跟期望的一样,Node应用的性能远远超出Java。(响应时间至少快1倍以上)。

译者注*  NodeJS跟许多其他单线程语言一样,对内存并不贪婪,因为没有关于线程的内存开销,内存占用不会随着连接数的增长而增长,尤其在剔除掉读写文件/数 据库等异步操作后,完全基于内存的NodeJS将有更显著的性能提升,从某种意义上来说基于内存的nodejs服务所能支持的最大并发数将仅受限于带宽和 CPU的处理能力。
可参见: 性能测评:Ngix_Lua, Node.JS Python三者性能相当,均比php快近一倍,  PayPal为什么从Java迁移到Node.js


缓存应用

图1: 关于缓存应用的原理图。缓存支持插入,获取,删除键/值对


图2: 关于应用更详细的物理图



这 里使用了另外一种形式的REST,cache操作通过HTTP verbs来完成(Insert = PUT, Fetch = GET, Remove = DELETE)。数据刷新通过使用timeouts(Node)和scheduled threads(Java)来完成。缓存冗余是通过服务器间的REST调用来实现。(通过PUT/DELETE)

对于Java SOAP的扩展,cache操作通过经典的HTTP POST SOAP包来实现。

应用层结构

图3: 基于Cache的Java REST组织结构图。Apache Tomcat + Jersey (servlet)在这一层。



图4: 基于Cache的Java SOAP组织结构图。Apache Tomcat + Axis2 (servlet)在这一层。



图5: 为Node应用。仅初始化了一个worker。




测试


图6: 为我测试时使用的环境




Java + Node REST 缓存插入测试
ab -A username:password -u restput.txt -n 1000 -c 1 https://server/ctispan/rest/key/111 > results.txt

restput.txt
value=test111

Java SOAP 缓存获取测试
ab -A client:password -T "application/soap+xml; charset=UTF-8" -p soapget.xml -n 1000 -c 1 https://server/ctispan/services/CacheProxyWS.CacheProxyWSHttpSoap11Endpoint/ > results.txt

soapget.xml
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns1:getValue xmlns:ns1="http://server.ctispan.jwisoft.com"><ns1:key>111</ns1:key></ns1:getValue></soapenv:Body></soapenv:Envelope>

Java SOAP 缓存插入测试
ab -A client:password -T "application/soap+xml; charset=UTF-8" -p soapput.xml -n 1000 -c 1 https://server/ctispan/services/CacheProxyWS.CacheProxyWSHttpSoap11Endpoint/ > results.txt

soapput.xml
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns1:putValue xmlns:ns1="http://server.ctispan.jwisoft.com"><ns1:key>111</ns1:key><ns1:value>text111</ns1:value></ns1:putValue></soapenv:Body></soapenv:Envelope>


结论

下 面A/B测试生成的一些数据。对于Node对比Java的结果,我并不吃惊。不过对于Java REST和SOAP的对比让我稍微有些吃惊。我原本以为因为SOAP的复杂性,REST的性能应该比SOAP好很多才对。这也许是因为Apache Axis2 API要比Jersey API高效的多造成的吧。












回复 (15)
  • #
  • #1 爱落空 1392127347000
    完胜吧
  • #2 OurJS 1392129902000
    @爱落空

    多谢建议,标题己更改
  • #3 ijse 1392169318000
    赞, 至少证明了node.js在某些应用场景下比Java更合适。
  • #4 醉温柔 1392169671000
    @OurJS

    原来是完败?其实完败跟完胜的意思是一样的
  • #5 若即若离 1392179799000
    你测试的准吗
  • #6 p2227 1392180801000
    完胜跟完败意思都是一样的,都是主语优于宾语的意思。
  • #7 线结边 1392256490000
    瞎tm测
  • #8 精灵天使 1394984056000
    去掉文件数据库读写,这种测试有意义么
  • #9 薛天仓 1414493713999

    @精灵天使 #7

    呵呵。。你确定你们公司都不用缓存。

  • #10 余她凤 1432609810889

    不上代码的测试都是耍流氓,呵呵。

  • #11 薛于方 1452828219396

    换nio的jetty试试

  • #12 常处本 1458722798401

    @OurJS #1

    33

  • #13 王广叶 1467617733107

    跟Java比差远了。。。。这个场景来说,事件驱动比较有优势,所以应该跟Java的事件驱动框架Netty进行对比,Netty是nodejs的6倍多~这个场景最快的还是C++的框架然后就是Java的了~

  • #14 易优弓 1506935478028
  • #15 赵双圾 1527822663112

    傻逼测试 你换java netty

微信扫码 立即评论