您的位置:首页 > 理论基础 > 计算机网络

高性能网络服务器框架设想(未完待续)

2008-06-16 12:36 295 查看
这个框架主要特点在于:1。跨平台 2。高性能 3。多项服务整合。此框架将顺利运行在Windows和Linux操作平台上;网络传输模块皆使用各个平台所提供的最高效的网络IO模型;此外,使用此框架实现的服务器能够同时提供多项整合的服务功能,比如同时提供http服务和ftp服务。

以下是我的一些关于设计方面的思考,比较乱。基本上想到什么写什么。以后会继续补充。感觉现在离整个设计框架成型还比较远。

网络服务器的编程方面,最重要的一个原则是逻辑应用层与网络传输层分离。这可以带来两个好处:首先,便于编程,逻辑应用层的代码只用管逻辑部分的问题,不用考虑数据传输层的实现。同样,网络传输层的代码只用于管理具体网络传输,不受上层任何功能的约束。许多事实证明当设计者专注于某一有限的领域时,可以编出更加高效的代码。其次,便于模块的替换,因为层与层之间相对独立,任何一层有所改动甚至被替换都不会影响到另一层的功能。一个比较典型的例子就是:网络传输模块在Windows平台下面使用的是IOCP的机制,在Linux下面使用的是EPoll机制,在平台迁移的过程中,网络传输模块可以用另一种机制被完全地替换而不会影响到逻辑应用层一丝一毫的代码。(当然,实现这个功能前提是这两个层之间定义了稳定而全面的接口,这个接口必须能够包容两个平台上不同的网络传输机制)

分层固然优点很多,但上下两层的协作因为彼此的分离增加了许多的难度。我将使用两个任务队列来保证上下两层的交互,这个两个队列分别为上行队列和下行队列,这两条队列不光是传送网络的接受和发送数据,一些逻辑层用来控制数据传输层以及数据传输层的反馈信息也是通过这两条桥梁进行传递。此外由于考虑到中间传输的信息优先级有所不同,这两个队列必须实现为具有优先级功能的结构。在这两个优先级队列的出口两端必须各有一个分析任务,分配任务的线程。逻辑层和数据传输层各有一个线程池,任务分配线程将任务从队列中取出分析后再从线程池中取出一个空闲线程加载运行。任务执行完毕,再从新放回线程池中。这样这个架构中所具有的线程池的数目已经达到了3个:包括逻辑层一个,数据传输层中两个(iocp一个以及框架管理的线程池一个),带来的问题首先是编程上面比较麻烦,其次,我担心3个线程池会不会导致性能下降。

逻辑层的构想是想让网络服务器能够同时运行多个服务(比如作为ftp服务器的同时也作为http服务器运行)。一个服务可以被视为一个功能模块,用户可以指定加载多个功能模块,这些功能模块可以在服务器初始化的时候被静态加载,也可以在服务器运行的时候被动态加载或卸载。功能模块自身与特定协议绑定,协议与服务器本身无关。同时如果能够实现TCP,UDP混杂的iocp,那么理论上大部分的基于TCP和UDP的服务都能够通过此服务器框架提供。

一个连接一个线程的模式与线程池轮流处理连接的方式各有优缺点。前者相对比较简单,但是线程数随着连接数的增加而增加,资源使用量过大。后者在资源使用的方面优势明显,不过却不具有前者相对比较简单的逻辑。(事务处理涉及到的Session要在线程之间交接)

<未完待续>

本文出自 “一网无垠” 博客,请务必保留此出处http://unliminet.blog.51cto.com/380895/82323
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: