`
qiezi
  • 浏览: 491779 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

网络服务器架构模式

阅读更多
前段时间做了个简单的dtwisted项目,只有个雏形,高层点的东西就没有了。

以前用ACE做过小型游戏服务器、视频转发服务器,比较熟悉点的是reactor模式。其间也尝试过proactor,一知半解不得要领,于是放弃了。

今天工作闲暇尝试用D语言实现目前工作中用到的文件上传服务器,有了一些思考。

下面还是先为D语言做点广告。稍后回来。。。

自从用了D语言以后,我可以更加方便地尝试一些想法了,用C/C++实现很多东西都比较麻烦,而且即便实现出来也必定有许多看不过眼的东西和实现方式。使用C++开发有几年了,从我接触的同事实现的代码来看,包括我自己的代码,基本上没有能让我看过以后觉得“还行”的代码,光是Big Three就够伤脑筋的了。使用D语言以后,我自己觉得要考虑的细节少多了,更多时候我是在考虑如何架构。从开发效率上来讲,D已经足够快了,我甚至觉得已经不比一些脚本语言慢。从维护成本和运行效率上来讲,它都足以让你满意。

欢迎回来。。

通常网络服务器在并发连接比较少的时候,根本不需要考虑得太多,我们可以用单线程select+阻塞操作,也可以单线程+非阻塞,还可以多线程(每连接一线程或是线程池都不麻烦)。当并发连接数比较多的时候,几个问题就出来了:

1、单个连接传输效率下降。这个可能不光是并发数多引起的,也可能是外网带宽引起的。
2、连接数过多。每连接一线程导致线程开销过大,过多的线程同时操作可以引起IO性能急剧下滑。用线程池阻塞方式处理?可能几个慢客户就拖慢了整个服务器,实际上服务器并无负担,但线程全被占用。
3、文件上传服务器每个客户占用时间都比较多,采用每连接一线程可能导致每个客户传输效率都下降,采用线程池又只能同时处理有限的连接数。

以上几个问题在使用reactor模式后大部分可以解决掉。reactor的基本方式是使用事件方式,可以单线程处理所有连接,由于它只处理有事件的socket,所以不会长时间占用线程。如果在业务逻辑中有耗时操作,或者是IO等待,还可以实现多线程的reactor,相当于是实现了一个线程池,同时又没有上面所说的线程方式的缺点。

回到今天的试验,打算用dtwisted实现目前的文件上传服务器。文件上传服务器目前是基于短连接的,每个连接建立以后,发送一个包头。这个包头是通用格式,首先是包头长度,有了它就可以解出完整的包头,包头里面包含上传路径、文件长度和文件签名。

使用dtwisted,直观的实现方式是从Protocol上先实现一个通用的解包头的类,所有需要解包头的协议都从它上面派生。dataReceived方法里面先判断包头长度是否已经收齐,通常这要占用2-4字节。如果收齐了长度,就进入收包头状态,直到包长度收完,然后开始处理包。由于包类型可能有多种,方便以后扩充,所以从收取包到解出包头都是一个同样的模式,写成一个基类供业务逻辑类派生使用。

目前为止这个模型是合理的,我甚至把消息类都写成接口,这样不同的解包方法都可以兼容。

不过接下来一个需求打乱了这个过程。上传消息和其它几个消息不一样的地方,是包头后面直接附加了文件内容。由于前面进行了封装,所以包的处理方法的参数就是包对象,不再包含socket或transport对象,使得接收文件内容有了麻烦。当然我也可以直接调用transport来收取,但总觉得这样和基类实现依赖太高。同时这个模式还有几个缺点:
1、dataReceived要处理当前状态,这种状态的处理增加了复杂度。
2、即便可以直接调用transport来收取文件,但由于是单线程,这会导致所有其它客户都会被阻塞,违背了使用reactor的本意。
3、类层次过多,每个层实现的功能太少。

基于这几个缺点,于是想到另一种实现方式。在连接建立时,服务器发起一个读请求,指示该读取4字节(包长),并传递一个处理方法委托。当该连接收齐这4字节时,调用处理方法。这个处理方法把这4字节转成包长,接着发起一个读请求,指示该读取这么多字节的包内容。再一次收齐时,就开始解包及处理过程。如果收到的是上传消息,发起一个读取文件内容的请求,指示读取指定长度,比如是40k。在读取到文件内容以后,调用处理方法写入文件。当然一次收齐40K才处理也不合理,但收包头的过程中又希望它收齐才处理,于是在发起读请求时指定一个参数,说明是全部读取完毕才处理,还是有一点就处理一次。

上面这个过程基本上是状态方式的一种升级,发起请求就包含了这个状态,只不过现在是隐式的和看起来更合理的。

终于整个过程合理了。仔细想了一下,这不就是proactor吗?proactor本身的实现还可以优化,只有发起过读请求的连接才会加入到事件检查中,效率上可能会有优化。
分享到:
评论
3 楼 qiezi 2007-06-25  
如果是有接收线程,分派任务到线程池最简单的办法就是使用同步队列,所有工作线程都阻塞在同步队列上,收到一个就发信号让阻塞的工作线程取到数据,这种模式的问题在于队列可能累积。另一种模式就是上面说的多线程跑select,也比较简单,其它方式相对复杂。
2 楼 qiezi 2007-06-25  
我上面所说的多线程reactor,实际上是ACE的方式,它用一组线程来跑reactor。比如reactor用select,那么在select的时候通常是阻塞的,所有线程都在排队等着执行select。排在前面的线程select返回后,就获得一个socket,并把socket从fd_set中清除防止其它线程再操作同一个socket,然后该线程开始调用socket关联的handler,其它线程依次类推。
1 楼 xombat 2007-06-23  
我仔细读了您的文章,但是对那些模式我没有读懂。下面我用c的思考方式来说一说。

引用
reactor的基本方式是使用事件方式,可以单线程处理所有连接,由于它只处理有事件的socket,所以不会长时间占用线程。


上面这个可以使用c的select实现,但是这个

引用
如果在业务逻辑中有耗时操作,或者是IO等待,还可以实现多线程的reactor,相当于是实现了一个线程池,同时又没有上面所说的线程方式的缺点。


c语言中怎么实现呢?
我也做过一个简单的web服务器,用c,但是对设计我一直找不到一个很好的解决方法,希望探讨:
http://xombat.iteye.com/admin/show/93518

相关推荐

    空间信息G/S网络访问模式体系架构初探

    借鉴已有的空间信息网络服务体系结构的原理和技术体系,探索研究一种新型的空间信息网络访问模式——G/s模式,并从G/S模式的特点出发,提出并分析G/S模式的架构和技术体系。最后给出一个基于G/S模式的应用系统...

    计算机网络安全服务器的网络架构.doc

    本文就是重点探讨一下计算机网络安全理念下的服务器架构,以期通过安全架构 的方法尽可以避免网络事故的发生,进一步加强网络服务器的安全建设。 1 服务器的网络安全体系防护体系 任何一个服务器都有与之相关联的...

    网络棋牌游戏服务器架构.docx

    二、系统结构 系统选用的开发工具是优秀的Microsoft Visual C++.net2003,系统采用客户端/服务器(C/S)编程模式,TCP/IP协议作为客户端和服务器的通信网络层,运用具有性能最优的完成端口(IOCP:Input/Output ...

    网络教育公共服务模式架构设计

    网络教育公共服务模式架构设计 为了进一步推进优质数字化学习资源共享和公共服务体系建设, 近年来众多专家学者倡导基于数字化学 习港构建数字化学习支持服务体系。本文在此构想的基础上, 探讨了网络教育公共服务的...

    云计算技术下的智能云网络架构模式.pdf

    云计算技术下的智能云网络架构模式.pdf

    图书馆读者网络服务系统的架构与实现

    论文详细分析了读者网络服务的需求,比较了国内典型图书馆的网络服务模式,并对开发此项服务的关键技 术进行了深入的分析。在此基础上,设计了一个基于www服务器和web浏览器的读者自助服务系统,实现了书目检索、...

    C/S模式文件传输网络应用的开发

    同时,要求每个服务器能够支持多个客户端的同时访问,不同的客户端的服务可以通过端口号来区分。 在UDP方式的大文件传输,每次传输的文件大小超过一个数据包,必须考虑数据包的切割分块问题。 用C语言编程实现

    多层体系结构开发模式

    简明易懂的阐述了多层架构开发模式的特点!推荐

    高校网络安全服务新模式探索--以基于大数据分析与云端的网络安全综合服务平台为例.pdf

    高校网络安全服务新模式探索--以基于大数据分析与云端的网络安全综合服务平台为例.pdf

    Linux操作系统:FTP服务器简介.pptx

    图1FTP服务架构(来源:自创) FTP服务器工作原理 图2 FTP服务器工作原理(来源:(网络服务器搭建、配置与管理)教材) FTP服务的传输模式 1、主动传输模式 图3主动传输模式(来源:(网络服务器搭建、配置与管理)...

    5G网络优化,网络架构新思路

    新技术 新形态、切片、 NSA/SA组网 服务化、虚拟化、 集中化 资源需求大 SPN新网络 芯片与网路不同步 兼容性问题多 度提升N倍 动 化 智 技术 传统靠人工与经验的运维手段无法满足需要 能 品组织 现有运维组织,...

    各种系统架构图与详细说明

    整体应用系统通过SOA面向服务管理架构模式实现应用组件的有效整合,完成应用系统的统一化管理与维护。 2 应用资源采集 整体应用系统资源统一分为两类,具体包括结构化资源和非机构化资源。本次项目就要实现对这两类...

    基于Akka的高性能可伸缩的JAVA网络游戏服务器 简单的单服务器开发与集群开发的切换 使用Actor处理高并发 易于测试

    高性能,可伸缩的Java Tcp服务器架构,1.Avalon基于Akka构建的服务器核心。天生分布式基因便于横向拓展;2.网络部分使用Netty;3.服务器分为单服务器和多节点分布式服务。Akka使用版本2.40。在单节点模式下,和传统...

    云制造_面向服务的网络化制造新模式

    云制造_面向服务的网络化制造新模式

    互联网企业网络架构优化实践从应用交付到云计算

    资源名称:互联网企业网络架构优化实践从应用交付到云计算内容简介:应用交付网络架构设计从应用交付到云计算案例分析通过本地负载均衡和广域网负载均衡处理,屏蔽用户端对真实服务的感知,使系统运维可以实时、在线...

    基于CS和BS模式架构的图书管理系统设计

    建设图书馆管理信息系统是实现图书馆信息化管理的必要手段,目前基于,- ....用现有服务器、终端、网络和数据库技术,对各种图书资料等信息进行有效管理。特别是/- . 系统的投入,能极大的方便 读者检索。

    基于网络监控程序开发的客户机/服务器工作模式.pdf

    基于网络监控程序开发的客户机/服务器工作模式.pdf

    架构风格与基于网络的软件架构设计-博士论文

    服务器的主要开发者。他为 Web 架构的设计作出极其杰出的贡献,他的工作为 Web 架构奠 定了坚实的基础。 译者简介: 李锟(ajaxcn.org 网站 站长)、廖志刚(91yee 翻译社区 负责人)、刘丹(Matrix 技术社 区负责人)、杨光...

    基于G/S模式架构的数字旅游服务平台研究

    空间信息技术的迅速发展使空间信息融入数字旅游成为可能, G/ S 模式是一种新型的空间信息网络服务模式,在研究数字旅游服务平台框架体系的基础上,研究并提出一种利用G/ S 模式架构数字旅游服务平台的方法和实现思路。...

    微服务架构及设计模式

    MSA将会加快服务从想法到部署的落地速度增强弹性:MSA将会提升我们服务网络的弹性开启可见性:MSA支持为服务和网络提供更好的可见性你需要了解建设微服务架构背后的几个设计原则:可扩展性可用性韧性灵活性独立自主...

Global site tag (gtag.js) - Google Analytics