Skip to content
Calvin Xiao edited this page Dec 20, 2013 · 7 revisions

Node.js 性能测试模拟器

Why?

性能测试时,可能需要一些系统外的被依赖服务的模拟器,常用性能测试工具如JMeter并没有模拟Server端的能力。如果是另外起个Tomcat,写些简单的模拟器——性能与容量是一个问题,因为被测试服务器集群可能有二十台机器,而跑模拟器的机器可能只有一两台。另一个是如果要快速修改输出内容,Tomcat的打包上传部署流程略显麻烦。

所以看上了Node.js。

另一个选择是DreamHead同学拿了Java Duke大奖,登上时代广场大屏幕的Moco,可以用一段JSON控制模拟器的返回。

How?

Node.js的最简单版很吸引人,相信大部分人都是被下面的例子骗上贼船的。

var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

用node.js simple.js即可运行这个Web服务器。所以,Node.js 是一个用JavaScript编写业务的服务器。

Then?

上面的例子虽然爽,但真正作为模拟器水就开始深了,springside的support/node.js/static-response.js是返回相同的静止内容的完整示例。

1. 基于Cluster模块使用所有CPU

Node.js默认只起一个进程,使用一个CPU core,这显然浪费了。因此可以Cluster文档的示例代码,改造成按CPU核数量启动Node.js进程,在我的双核超线程的笔记本上就fork出了4条子进程。

2. Counter计算

因为现在多进程了,计算Counter也成了麻烦事情,Cluster文档又给出了示例代码,居然需要进程间通讯......

3. 定时打印Counter

设定定时器还是很简单的,只要调一句setInterval(function, interval)

打印日期时发现,自带函数居然不支持格式化日期,不想引入第三方库就只好写成这样,勉强也能出来 "2013-6-4 12:00:02" 这样的效果。

new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '') 

And Then?

然后,还有一堆问题呀,比如要返回动态内容,根据请求的url参数,xml/json内容返回相应xml/json格式结果,要一个模拟器应答多种请求,是不是要把Express拿出来用?

参考资料

joyent上的modules大全 joyent其实是node.js背后的公司,分类列了很多modules,但良莠不齐又没有评分。 [Node.js上的npm registry] (https://npmjs.org/) 有评分但没分类。