ACE开源服务器研究
最近一段时间我一直在研究一些基于ACE的开发,忽然有了一种想法。
估计很多的开发者和我一样,刚刚接触到ACE这样的框架,肯定有些头晕,而ACE本身的例子又过于的简单。
在网上查找了很多关于ACE的资源,问题都是很分散凌乱的,于是就有了一个想法,想写一个开源的高效服务器,隐藏最底层的细节问题,让服务器的开发者不用理会数据是如何传输的,而是更加专注于逻辑的开发。剥离复杂度。
于是这边年时间,我一直在用业余时间开发这种东西。目的很明确:
1.借助ACE跨平台的特点,开发一款能够跨平台的服务器。
2.剥离数据传输和数据逻辑,让开发者更加注重逻辑的开发而不是头疼高效的数据传输以及不同平台底层相关的问题。
3.尽量追求服务器的代码简洁易懂,最好的代码并不是复杂的代码,任何人都可以清楚的指导每个模块代码在干什么,最好做到就算新上手的程序都能看得懂,所以我没有大量的使用模板。
4.希望通过这个服务器广交对ACE有兴趣的朋友,一起研究提高。(我的水平不算太高,呵呵)
我的服务器目前开发进入了一定阶段,由于只有我一个人写,速度不是很快,但是大框架以及测试程序我已经搭建起来了。今天我觉得这个论坛有很多高手,于是斗胆拿出来让大家拍砖。
目前完成度是:
1.服务器已经完成了根据操作系统的不同,会自己选择proactor(windows)还是ACE_Dev_Poll_Reactor(linux,因为我觉得aio并不能很好的发挥作用,所以在linux下使用的是reactor)
2.逻辑完全剥离,所有的逻辑都已so或者dll的形式展现。比如要开发一个逻辑,只要创建一个dll或者so,继承一个虚类,数据就会根据命令头的不同把数据分发到不懂的dll或者so。这样做的目的是完全剥离逻辑,并为以后动态加载和卸载逻辑做准备。(不关服务器实现自动升级)
3.对底层数据加密,我剥离出来一个类,可以通过给这个类注入自己的加密算法完成对数据包的加密。
4.完善的日志系统,服务器会动态的记载当前处理指令情况,每个链接处理数据包的时间,数量,以及工作线程的状态。提供给开发者最完善的数据分析标准,也提供给自己对服务器的效率进行分析和配置。
5.本人做过一些网络游戏服务器的开发,于是结合者一些网游的经验,对服务器和客户端做了心跳和数据定时发送的一些大数据量时候的一些技巧。
6.相应的测试客户端,我写了两个,一个是100万个数据包的传输和回应。另一个是2000个链接链接的测试客户端。(目前比较简陋)。
好了,废话不多说,真心结交喜欢ACE的高手,也算抛砖引玉。我的QQ是: 41198969 有兴趣的话可以加我讨论技术。
上传在这里,如果版主认为不错的话,请加精吧。
我会不断的完善这个服务器的,希望给大家真正提供一个好用而且开源的服务器开发平台。
对了,最后说一句,我的开发环境是VS2005,在linux下编译前请修改一下Makefile.define文件里面的ACE路径以及相关配置。
尝试了几次上传源代码,结果提示不行,晕。请要代码的朋友,加我的QQ吧,或者请版主帮忙想想办法,我给版主。我用的是gogle的浏览器,似乎提示有屏蔽。
==============================================================================================
以后服务器更新都已此贴为准。
以下为此服务器的最新版本,目前版本号是V0.66(2010-04-30)。
修正了数据锁windows和linux下不一致导致死锁的问题。
修正了makefile文件,添加了makefile64(在64位linux下编译时请用这个),并在32位和64位linux下进行了商业化的应用,目前看效果还行。
完善了PostMessage()和SendMessage()两种发送数据的方法,用户可以在dll里面同步或者异步的发送数据。
简化了dll接口的数据,将dll要用到的系统类封装成一个SystemObject对象给用户使用。
优化了一些类的数据处理方法。在windows和linux下比较稳定运行。内存占用量的优化。
==============================================================================================
目前版本是0.70版本。
重写了Proactor和Reactor的处理数据流程,大量使用内存池和对象池。增加了解析包处理线程模式。
添加了ConnectHandler的对象池,可以通过配置文件修改ConnectHandler初始化的数量。
重新分配了各个文件的文件夹,将框架文件按照功能分类于不同的文件夹。
重写了Linux下的一些Reactor的makefile,目前测试环境支持64位和32位的Linux编译(CentOS,因为测试环境有限,以后多找一些Linux版本)。
增加了ViewMakePacketThread日志,用于定时监控主要对象池的使用情况。
windows生成的服务器框架,在Windows_Bin下,Linux生成的文件,在Linux_Bin下。
适当的修改了一下消息处理DoMessage()对象中的数据包格式,详细请参见Base模块下的BaseCommand.cpp
增加了新的测试工具,这里感谢freebird的测试工具,测试大并发链接数下的服务器参数,目前版本CPU和IO以及内存都比较稳定,30个线程下,每秒3000个数据包CPU大部分时间是0%,欢迎做大并发测试。
添加了CPacketParse类,用户可以通过修改这个类,来完成对数据包合法性以及数据包结构的判定,使得数据包格式更加弹性,将数据判定规则从框架中剥离。用户只需要提供自己的数据格式解析规则,框架就会按照这个规则去匹配数据格式。
这个版本历经两个月时间,在这里十分感谢支持我的朋友们,正是你们的使用,使得这个开源服务器一步步完善下去。在这里,谢谢你们,希望有一天,它能给你们带来更多惊喜和易用性,同时也希望更多的朋友,能给这个服务器框架提供宝贵的意见,我将会一如既往的坚持下去。
相对于0.68版本,修改了很多很多,无论如何,追求稳定高效是这个服务器的宗旨,在这里感谢大家的测试和使用,谢谢。
==============================================================================================
最近进行了一些多并发的测试,修改了一些小BUG,优化了一些内存池。这个版本在多并发下测试,比较稳定。==============================================================================================
目前版本是0.71版本。
修正了在链接达到上限后,服务器崩溃的问题。
添加了通过配置文件,可以控制连接数量的策略。使用者可以通过配置文件,来决定当前服务器最多能接收多少个链接,再多就不允许进入。
添加了判定存活包时间的设定,用户可以通过设置配置文件来决定存活包多久没有收到链接就自动断开。
重新设计了数据包解析,将数据库包解析变成一个dll或者so的动态库工程,剥离了数据包拆解对框架的依赖。框架会加载你的数据包解析的dll或者so,这样做,服务器框架甚至可以不用修改,直接编译即可,使用的时候只提供需要的dll即可,对于用户,只用写处理数据包的规则。
这里感谢KimilesWood,jackypeng,jamesyang680, 7cat,
modern的大力支持和测试。
新版本的服务器添加了一个PacketParse的工程,这个工程中的类,提供服务器数据包的解析。服务器使用文档正在撰写中。
==============================================================================================
目前版本是0.715版本。
因为最近频繁有朋友问我是否有新版本,最近由于集中精力写一个游戏,这个项目暂时更新很受阻。不过等过了这一段,我会继续更新下去的。
今天ACE6.0.0发布了,由于其中一些头文件发生了变化以及一些宏的调整,在5.7.x下能运行的ACE程序已经不再适用于6.0.0。我在此也做了一些修正,把服务器提升到6.0.0的版本下,这次改进以后,本服务器不再支持低于6.0.0的ACE版本。
彻底修正了一只被朋友们所诟病的linux下Crtl+c无法中断的问题。
对内存池进行了进一步的整合和优化。
更新了6.0.0不支持的若干宏。
更大的版本升级将会提升服务器间通讯的模式。更加方便于使用者。==============================================================================================
目前版本是0.75
重构了服务器间消息发送,将服务期间数据通讯交给逻辑DLL去处理。
修改了一些接受和发送数据的计数器的问题。
修改了一些头文件和代码,使得框架支持6.0.0以前的ACE版本。
添加了工程说明文档。
另外,特别感谢7cat,Dave,五彩修改花针,Modern的大力支持。
祝愿大家2011春节快乐。==============================================================================================
目前版本是0.76
经过考虑,还是重写了接受和发送数据的引用计数问题,因为在0.75中,引用计数只适合1:1或者N:1的数据传输类型,为了满足任意N:M的关系,所以最后还是把这里改进了。
解决了linux下编译失败的问题,以前有linux机器,后来改了版本之后没有修改makefile文件,给大家造成的编译问题在这里请大家谅解,后来在自己的机器上装了一个linux虚拟机,以后发布的版本我都会在此上编译成功运行再发布。
修改了帖子里大家提及的一些BUG。
另外准备在下个版本下,添加对链路建立和关闭对dll的通知机制,目前还没有想好如何做会让用户使用方便。还会添加管理工具的监听链接,达到以前设想的远程服务器控制,这部分版本将会在0.77版本发布的时候完成。
这里感谢大家的支持,希望大家更多的提供意见和建议,为更加方便大家使用,我会继续努力。
============================================================================================== 目前版本是0.80 这里感谢BadBrain的大力帮助,新的版本添加了很多功能,并修正了以前的一些BUG。 添加了管理接口,框架允许可以通过客户端的方式连接管理接口(接口地址在main.conf里面设置,并可以设置允许接入的IP地址,其它IP则不允许使用管理端。) 添加了PSClient管理测试客户端工具,你可以通过这个工具去查看服务器的情况。(这部分代码也开源出来)目前包括如下功能 1.添加管理登陆模块
你可以通过这个页面(在服务器配置了main.conf的情况下),建立和服务器管理端的链接。 这个页面你可以查看,添加,卸载当前服务器上的so或者dll模块。这些文件必须在服务器上已存在,添加模块的时候必须制定模块路径(可以是相对路径也可以是绝对路径) 删除模块时间可能比较长(默认等待2秒),因为要等待模块当前正在运行的线程全部结束后才会终止。 2.查看当前客户端链接数
你可以在管理工具登陆后,查看当前有多少个链接在和服务器链接(此时正在存活的)。 3.模块详细信息
你可以在这里查看当前模块支持哪些命令,并且这些命令被调用了多少次。 4.服务器线程管理
这里你可以查看服务器当前工作线程的运行情况,包括处理了多少个包,处于什么状态,处理包平均时间等等。 5.这里你可以看到当前所有存活的链接是什么状态,包括链接存活了多久,发送了多少数据,接收了多少数据等等。而且你还可以根据ConnectID决定踢出那个链接。
6.这里你可以决定服务器上不允许哪些IP链接,这里分为两部分,一部分是永久封禁,另一部分是时段封禁(你必须给定封禁秒数),永久封禁将写入服务器配置文件,随着服务器下次重启自动生效。时段封禁并不存储。
7.服务器性能测试,这里你可以测试服务器的性能,比如多线程,多数据包的测试。
另外,在服务器端添加了三个新的特殊信号,就是客户端链接建立(尚未发送数据),客户端链接断开和服务器主动断开客户端链接。逻辑dll可以选择订阅这三个信号并做一些处理。(具体请参阅base模块的例子) 重写了消息分配机制,现在的消息框架支持一个消息可以分发给若干个dll或者so的订阅者,这样做到消息的弹性和灵活。你可以两个或者更多的模块订阅一个消息。 重写了线程自我修复功能,在线程遇到阻塞的时候,框架会尝试杀死当前线程,并重启一个新的线程替代,尽量保证系统的可持续性。(这里如果是因为某些内存分配造成的阻塞,就算重启线程也不会有好的效果,这里只能处理一部分可能导致阻塞的问题,并不是万能的。) 修正了在linux下关闭进程造成的dump。 修正了部分linux下导致进程崩溃的问题。 添加了windows服务器下,当框架崩溃的时候自动生成dump文件的功能。 修改了若干不合逻辑的部分,优化了消息发送。(windows下请用release版编译测试) ============================================================================================== 目前版本是0.81 修正了在Reactor模式下发送数据有时不完全的BUG。 添加了对UDP协议的支持,框架可以支持UDP协议的传输和转发。 创建了doc目录,这里面是框架使用的相关帮助文档。请读"先读我.txt"(以前很多朋友抱怨没有文档,在这里有完整的配置说明和一些帮助文档,以后会持续增加) 删除了Base模块,取而代之的是example-Module目录,所有的样例逻辑模块代码都在里面。以后会陆续增加。 鉴于有些朋友在linux下编译PurenessScopeServer的问题,请读"先读我.txt",我把正确编译使用这套系统的说明写在了里面。 扩展了PSClient的监控,可以监控UDP协议服务器发送和接受数据的情况。还添加了可以远程监控框架CPU和内存量的一个接口。 再次感谢大家的支持,谢谢。希望这个工具可以帮你加快开发的步伐,减低服务器开发的门槛。 ============================================================================================== 目前版本是0.82 修正了Proactor模式下IOCP多线程数量为0的问题。 修正了UDP在处理逻辑时间超长后,远程客户端关闭UDP端口,造成的服务器不响应问题。 修改了共享内存中的指针偏移问题。 重新整理了IObject接口对象的接口信息 添加了在VS2005下的文件分类过滤器 添加了UDP发送是否包含包头的选项。(默认为包含) 添加了对TCP的链接监控,当链接请求单位时间超过了一定数量,则禁止该IP访问一段时间。 添加了对TCP的单位时间数据包流量超过一定大小,强制关闭链接,并禁止该IP访问一段时间。 添加了PSClient监控所有历史链接信息的功能。 添加了《逻辑模块可使用对象说明.txt》 添加了DataServer对应的共享内存缓冲用例。 ============================================================================================== 目前版本是0.83 修改了在reactor模式下,当客户端发生Block的时候,服务器等待100ms重发引起的低效问题。重写了这部分代码,当Block发生的时候,自动将这个链接切换成缓冲模式,缓冲没有发送完的和还需发送的数据。定时重试发送,这样做不会导致服务器发送效能降低的问题。 去掉了SendMessage(),此前这个方法是利用工作线程完成的。全部替换成PostMessage(),并添加了"性能追迹者",框架响应时间分为三部分,第一步分是接收完整数据包,到工作线程取走所消耗的时间,第二部分是工作线程消耗时间,第三部分是工作线程发送,到发送完成的消耗时间,这样做便于找到服务器响应慢的环节,比如,在哪个环节导致了服务器的低效,并且这三部分会生成日志文件。 重写了重载模块方法,以前是定时杀死要重启的模块,这样做很生硬,而且会有可能引起框架的崩溃,从写了这部分,添加模块引用计数,当引用计数为0的时候,自动重启。 添加了监控系统中模块启动时间,便于监控。 ============================================================================================== 目前是0.833版本 去掉了Buffpacket的线程锁,因为上层保证了单线程的调用,所以这里的线程锁不再需要,而且这里的锁有可能会引起死锁,在这里完全去掉了 去掉了解析数据和加密数据线程池,尽量减少线程间的切换,这部分换算完全可以在接收和发送线程去做,去掉后框架整体速度提升了接近20%。 解决了注册命令的一个BUG,以前注册命令的时候会直接返回,在这里修正之。 ============================================================================================== 目前版本是0.84 开始在Linux下使用valgrand帮助我的代码判断,添加了两个脚本,一个是valgrind-efc.run(用于监控,在程序运行时,所有函数第调用时间,包括多线程下的不同函数,用于找出哪个函数执行时间多造成的性能损耗),一个是valgrind-mem.run(用于监控程序运行的内存泄露,并给出泄露的代码位置)。这两个脚本都必须在安装valgrind以后才能使用。至于这部分的使用,我会给出一个文档予以说明。
添加了消息到达处理时间,和消息发送时间的性能指标(单位是纳秒级,用于监控框架在消息处理的下的时间
重写了发送方法,上层接口调用不变,支持多线程的数据发送。不同的链接可以在不同的线程下发送,达到并行的目的,但是前提是,你需要估算你的CPU核心是否可以满足你的线程数,过多的发送线程可能会造成实际效率下降。这一部分,你可以通过配置文件进行管理。
优化了消息信息,你可以管理监控一个完整的消息被处理的时间和次数。
追加了日志,添加了接收超时和发送超时的日志信息。定时输出了BUffPacket内存池的管理情况。
修改了一些BUG,并合并优化了一些无用的代码。
客户端添加了压测客户端。 重写了PSClient测试模块,改成异步数据收发模式。 在PSClient添加了对模块指定命令处理时间信息的方法。 在example-module里面添加了lua的语法支持模块,可以将收到的信息转发给lua模块。 在linux压测下,目前能到每秒2万个数据包的处理,具体测试数据,请以自己的测压环境为准,此数据仅供参考。 另外,本版本更新了以前自己手写makefile的方法,当然,你可以用,把makefile_BAK改成makefile,以及把makefile_BAK.define改成makefile.define即可,新的编译方法是,运行runlinuxmpc.sh(前提是你要给执行权限),系统就会自动给你生成一个makefile文件。然后直接make即可,推荐第二种方法,第二种方法借用了ACE的mpc机制,编译检查非常完善,这里感谢Stone和dave的支持。
============================================================================================== 目前版本是0.85 添加了模块间通讯通讯的方法,你可以在不同的逻辑模块中传递你的数据。 修改了在发送过程中计数器引用的BUG,导致某些链接释放不完整的问题。 添加了德克萨斯匹克的游戏插件。(详细文档请阅读本论坛的PSS游戏插件开发系列) 添加了共享内存数据模型,用于支持用户登录与登出。(详细文档请阅读本论坛的PSS游戏插件开发系列) 去掉了配置文件中某些无用的选项。改善了防频繁链接机制,更加有效的判定可疑链接经过并发测试, 这里强烈感谢,痛快,Stone,ZZZ的大力支持。
==============================================================================================
目前版本是0.86
修改了退出时,CommandList列表指针内存泄露的问题。
添加了PSClient客户端详细压测报告
修改了在Linux下Connect的时候IP链接没有被重置的问题。
修改了Proactor关闭的资源清理问题。
添加了ProcessLine性能监测客户端。
添加了LoadRunner压测脚本实例。
重新设计了性能计数器样本,更精确的计算性能消耗。
==============================================================================================
目前版本是0.87
删除了对已经阻塞的工作线程重启动作。添加了对二进制数据块的传输接口。添加了客户端工具对二进制数据的打包发送方法。
下载地址 google Code http://code.google.com/p/purenessscopeserver/downloads/list ==============================================================================================
目前版本是0.90
重写了所有客户端工具,第一个是远程管理客户端工具,不在依赖duilib,第二个是插件性能检测工具,第三个是压力测试工具,都是基于MFC,可以直接编译。
重写了配置文件,所有配置文件全部xml化。
优化了发送队列。
解决了服务器间发送的若干BUG。
进一步增强了框架的可监控性。
添加了对IP段的禁止支持。
==============================================================================================
目前版本是0.91
1. 修改了dev_poll下设置并行最大连接数配置文件对应关系。 2. 再次更新PacketParse?接口,优化了接口结构,使得开发者更清晰的看到自己要实现代码的地方。
3. 更新插件压力测试工具。支持TCP和UDP压力测试,并会生成测试报告。
4. 更新MakePacket?回应包添加CommandID参数,你可以根据不同的连接ID决定处理你的发送组包逻辑(比如加解密的随机算法)
5. 服务器添加了对UDP recv超时的设置
6. 更新了UDP Proactor模式下的UDP设置参数。
7. 添加对IPv4和IPv6的支持。服务器可以使用IPV6的地址,但是前提是OS必须支持IPV6
8. 添加类视图文档,以PDF文档形式提供。
9. 更新插件压测工具,提供多线程压测插件功能。
10. 修改了TCP和TCP服务器间测试用例,实现了透传数据的压测用例。
11. 添加了Linux下结束进程的脚本
12. 添加了时间成本宏,你可以用于你的逻辑中,测试函数执行效能
13. 添加三个Try catch宏用于程序调控。你可以用于你的逻辑中,套在函数里。
14. 添加了服务器发送数据水位标,如果服务器发快客户端收慢,那么会有一个阀值保证正常的连接不受影响。
15. 修改了若干测试出的BUG,具体可以浏览SVN更新日志。
16. 添加了DEBUG模式,在debug下支持输出所有的数据包文件。这些数据包可以变为压测的回放的依据。
============================================================================================== 目前版本是0.92
1. 优化ConnectHander的代码结构
2. 添加发送超时配置文件
3. 添加了新用例,ftp用例,实现相关了目录浏览,下载和上传(PSS插件以及测试客户端)。
4. 添加如果二级缓冲用例,实现共享内存和数据库的同步(PSS插件以及测试客户端)。
5. 添加了插件间相互调用用例,实现了插件间的通讯((PSS插件以及测试客户端)。
6. 添加Linux下自动设置当前工作目录的功能。
7. 添加了PSS自测插件功能,实现PSS数据包自测用例(PSS插件以及测试客户端)。
8. 更新了PassTCP工具,可以支持二进制和文本的数据包发送。
9. 重写了PSS日志接口,支持输出到屏幕和文件的选择,并支持文本和二进制的记录。
10.添加了Proxy代理服务器数据包转发插件,实现了PSS网关功能(PSS插件以及测试客户端)。
11.添加了新的API,允许插件可以获得工作线程的数量以及当前工作线程的ID。
12.添加了uint64位数据的网络字序和主机字序的转换函数。
13.添加了再Linux下自检当前文件并发数的功能,如果文件并发数小于配置文件设置则框架会自动尝试提升当前文件并发数,如果失败则提示框架启动失败。
14.添加了对core文件的设置,开发者可以通过配置core文件大小来启动当前PSS。
15.添加了发送缓冲区自检功能,当发送字节和对端收到字节不成正比时,按照配置文件的规则回收当前连接。
16.添加了对BACKLOG的设置,可以提升在大并发连接下的连接效率。
下载地址 google Code(SVN)
http://purenessscopeserver.googlecode.com/svn/trunk/
github下载地址
https://github.com/freeeyes/PSS
|