最近要弄一个高性能的日志采集系统,想顺便弄一个通用的基于网络的反应式框架出来。
框架基本思想
进程模型:一个接受线程,可配置个工作线程。
编程模型:一个管理单例,所有的handler实例跟它注册自己所关注的命令号。管理实例根据命令号进行分发。
消息协议:kv格式,格式是k1=v1&k2=v2&...&kn=vn。其中c是关键字,对应的value就是命令号。
框架开发
一如既往的偷懒即是稳定
C++框架是基于Memcached修改的。把try_read_command中嵌入自己的入口代码,和框架的业务部分对接起来。这样就可以实现支持C++的业务框架了,同时享受Memcached的基本功能,比如deamon化,线程配置,支持UDP等。把它编译成静态库文件,这样就可以轻易的和业务代码分离。
JAVA的框架是基于MINA进行开发的。MINA已经支持一个接受线程,可配置个工作线程的进程模型了,而且有TextLineDecoder,TextLineEncoder基于文本的编解码。增加很少的代码就可以实现我们的功能了。
性能测试结果
过程:弄一个echo的Handler处理类,对请求内容直接返回。
环境:虚拟机, 8G内存, 2G双虚拟CPU(32K缓存)
数据:
处理能力
C++ | JAVA | |
100个连接 | 3.6~5W /s | 2.4~2.5 W/s |
10个连接 | 3.1~4.8W/s | 2 W/S |
100个连接echo 1K数据性能 | 2.4 W/s | 1 W/s |
整个过程中,JAVA的框架 0.7W/s以上,数值继续往上冲击就速度很慢了,大概原因是CPU已经撑不住了。
而C++框架都是迅速冲击上2W的。
目前框架的瓶颈在CPU上, 框架进程的CPU占用率都是100%的.
结论
同等CPU能力下,C++框架效率是JAVA的1.5倍以上。