HTML5和Websocket是新一代浏览器的主要特征,其中Websocket对Web服务器处理能力也提出了更高的要求,Alex与我们分享了他用groovy++和Gretty处理512K并行Websocket的试验。
那么为什么是512K而非1M呢?Alex做了解释,因为这次试验最终达到了524285这一数量,但是再往上就不灵了,服务器停止接受新的连接,估计与linux上TCP/IP调优有关,这个数字接近512K。当有大量用户处理需求时,这个试验可以作为评估硬件单元数量的依据。
这个试验是怎么做的?
服务器端很简单
- 如果有client发请求过来,返回一段包含groovy script的文本,该script将由client接收执行
- 接受并保持来自client的websocket连接,对于接收到的每个消息(普通字符串),都以大写字符串返回
客户端
客户端程序(运行在不同机器上),向服务器发出“scenario(测试方案)”请求,接收groovy脚本,编译并执行。该场景也很直接,客户程序打开64000个并行websocket连接,并且每隔25秒左右向服务器发送大约30个字符的字符串。
这样服务器每秒需要处理大约20000请求,大约600K/s的入出流量。为了模拟512000并行websocket,Alex使用了8台客户端机器及一台服务器,都是相同的"m1.large" Amazon EC2实例——7.5G内存、2虚拟内核、os跑的是Fedora11。其中2.5G内存用于Java堆(每个连接大约5K再加上kernel),整个CPU使用率低于30%。
服务器是用Groovy++写的,使用了Gretty。Gretty是一个基于Netty框架的轻量级服务器,本身是用Groovy++写的,充分应用了并行类库,它也是Groovy++标准类库的一部分。注意:Gretty并不是servlet容器或JavaEE相关容器。Gretty目前仅支持:
- 静态文件
- http请求(包括modern/param1/param2 REST-like请求)
- web sockets(包括老浏览器的long-polling emulation protocol)
为了便于理解,Server的代码片断张贴如下(该段代码是静态类型代码),关于更多Gretty的资料,可下载Groovy++最新版本源代码,对Gretty及相关示例代码进行研究:
GrettyServer server = [
webContexts: [
"/" : [
public: {
get("/scenario") {
response.text = """
.............. here is client scenario code ...................
"""
}
websocket("/ws",[
onMessage: { msg ->
socket.send(msg.toUpperCase())
},
onConnect: {
socket.send("Welcome!")
},
onDisconnect: {
}
])
}
]
]
]
server.start()
相关资源:

Gretty看上去很美
什么时候Grails能够支持Groovy++和Gretty呢?