Groovy++:512K并行websocket试验

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()

相关资源:

By songwei - Posted on 30 七月 2010

Gretty看上去很美

什么时候Grails能够支持Groovy++和Gretty呢?