整理了下通信服务器设计要考虑的问题,希望大家提提意见

cheeryanhua 2004-10-09 05:35:16
加精
首先就是这个性能问题,性能问题从用户,应用系统的角度而言就是,并发数(吞吐量),业务延迟。从计算机的角度来看,就是CPU每秒处理指令的数目,内存的占用率,I/O总线的占用率等等。能够并发为多少用户提供服务。这个就是要看需求啦,要看具体的业务,还有系统运行的环境,环境包括网络环境,硬件环境,系统软件环境。网络环境就是对外提供服务的网络带宽,系统内部网络等。硬件环境,就要看运行服务的计算机的硬件配置,比如网卡速度,主板总线频率,内存,CPU处理速度,CACHE大小,以及这个磁盘I.O总线的速度,这个硬件的配置需要仔细的选择,根据不同的业务需求,应用模式需要仔细测量,例如这个WEB性质的服务,对内存,以及磁盘IO影响比较大。系统软件环境,就是操作系统了,LINUX操作系统,WINDOWS系统本身的特点,比如最大的线程数目,最大的进程数目,每个进程能够打开的最大套接字数目。等等,这个要看具体的操作系统。
性能问题从用户的角度来看,从应用系统的角度而言就是,并发数(吞吐量),业务延迟。

对于这个并发数目我认为这个东西是不定的,不同的规模对系统结构的要求是不同的,在系统初期运行阶段,是无法完全进行预计的。所以我想这就需要在系统设计式考虑这个扩展性问题。就是系统性能扩展性设计。系统的处理资源总是有限的,用户的需求式无限的,那么如果要能够满足需求,要么增加资源,要么减少需求。现在考虑这个增加资源的方法。增加资源有增加单机资源以及增加多机资源。单机资源的提高,就不用介绍了,主要是要确定系统的瓶颈,到底是什么地方造成了系统的堵塞。而后按照相关的应用背景。对系统进行升级。多机资源,就是将用户的需求分布在不同的计算机上进行处理。所以在系统设计的过程中需要考虑这两个方面的软件结构设计。

关于软件结构设计问题,单机情况,需要考虑,怎样减少运算量,减少对内存的访问,减少函数调用次数,增加对寄存器的访问。怎样提高系统的并行性,减少CPU的等待时间,在编程的过程中可以考虑下计算机的硬件结构。可以通过汇编等等对关键位置进行优化。这些都是比较具体的问题,需要在开发的过程中进行测试。

多机扩展的情况,我现在一般是将系统的服务分布在多个进程或线程,使用线程就是却换开销小些,并且一个进程内的资源是共享的。使用进程,却换相对大些,进程间的交互相对麻烦些。比如使用PIPE等等,不同的平台方式不同。但是使用进程可以提高系统的可靠性。一个进程死掉了,如果设计的可以,其它的进程还是可以正常运行的,但是线程不同,如果一个线程死掉了,整个进程基本上就完蛋了,其余的线程服务也发生错误的机会就比较大。

这个通信系统的设计还要涉及到扩展性设计,稳定性设计,安全性设计,可维护性设计等等,问题比较多,希望大家补充。

我现在想把这个东西整理出来,以后设计的时候,可以按照这个来分析。
...全文
635 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheeryanhua 2004-10-27
  • 打赏
  • 举报
回复
up
zdleek 2004-10-22
  • 打赏
  • 举报
回复
支持 netsys2(来电!) :
通信服务器类似的东西 稳定性是压倒一切的!
temp3000 2004-10-20
  • 打赏
  • 举报
回复
请问“稳定性”中应该包括异常处理机制,有没有比较好的方法?
NetFair 2004-10-20
  • 打赏
  • 举报
回复
楼主:
您好,看到你的贴子,很感兴趣,现在我也需要做一个省级的通讯服务器,功能与你类似,想法也与你类似,只是功力不如你深厚,希望向你多学习。我个人也是认为:平台选择Unix,C++开发,Oracle数据库。
真的,想向你多学习!

MSN:NetHunter_78@hotmail
希望对通信服务器开发感兴趣的朋友,把我加为好友,一起讨论!
cheeryanhua 2004-10-20
  • 打赏
  • 举报
回复
to NetFair(Delphinind) ^_^,没问题,一起交流学习

to temp3000(temp3000) 关于这个异常错误处理机制。我习惯使用的语言是C语言,所以这里谈谈C语言开发对错误处理的想法。

1。软件是肯定会发生错误的。如果硬件平台发生了错误,这个软件做的再稳定,都没有办法。所以这个软件的稳定性主要是作合法性检查,以及系统运行状态的检查,以及如何纠正错误。

首先进行容错处理是要付出代价的。比如入参检查等等增加了这个函数运行的时间。还有运行点的检查,在关键的位置进行正确性检查。这个需要根据实际情况来判断。
我目前的思考习惯是首先看看我面向用户的接口是什么。这个用户可以是客户也可以是合作开发的伙伴。这个接口要作严格的检查,一般用户的输入信息是无法估计的,所以要对这个用户接口作仔细检查。对于合作开发伙伴在开发阶段应该对接口进行检查,按照约定的输入以及输出进行判断。有了这个接口检查,可以不让其它部分的错误造成自己模块发生错误,并且可以很快确定责任,以及确定错误。

系统应该有统一的错误编码管理。不同级别的模块应该使用不同的错误代码,对错误信息的提示也应该进行规范。在多级模块调用的时候,错误代码的返回也应该仔细的安排,可以根据调试的情况提供不同层次的错误代码,可以提供开关变量,但是尽量不要将代码值返回到太高的层次,底层的错误代码值返回到高层,这个思维的深度比较高,这个要根据实际情况,以及编程的习惯来调整。可以在编码完成后,进行优化。在开发之前就进行规划。

心中应该明确自己的对错误的严重程度认识。只有明确了这些问题以后,你才可以知道自己该怎么处理这个错误。那些错误是可以抛弃的,那些错误是必须进行纠正的,那些错误是可以容忍的。这个需要根据具体的编程接口以及用户的需求进行决定。
这是我在编码过程中对这个错误处理的想法。主要是从模块代码运行流程的角度来考虑这个错误处理,对于活动进程的处理没有涉及。
cheeryanhua 2004-10-19
  • 打赏
  • 举报
回复
安全性设计
安全性是个比较流行的题目,就谈谈自己的看法,^_^
安全性是有范围的,安全是有代价的。所以在作安全性设计之前就要明确自己有那些资源需要保护,各个资源的宝贵程度,自己可能受到那些风险,确定了这些以后才好作以后的工作。
当前阶段的工作作好以后,在确定针对各种资源各种风险,有那些安全技术,每种安全技术有那些代价。
当确定了这些东西以后,经过均衡就可以知道自己到底需要使用那些安全技术。但是要明确的是安全是三分技术七分管理。在先进的技术如果没有人的配置,就是废物啦,^_^,所以大的系统在进行安全技术设计的同时,也需要进行相关的安全管理制度的确定。

目前我作的安全通信服务器的东西,一般分为如下几个阶段,
1。认证阶段,确定用户是谁,是否可以访问服务。
2。鉴权阶段,确定用户是否有权限进行访问当前服务。
3。通信阶段 进行数据的交换。

各个阶段根据不同的需求采用不同的安全技术。这个就需要根据实际情况来定了,目前安全的技术资料也比较多,就不多谈了。^_^
fengge8ylf 2004-10-18
  • 打赏
  • 举报
回复
对通信服务器很感兴趣 学习
shakira008 2004-10-16
  • 打赏
  • 举报
回复
学习ing...
cheeryanhua 2004-10-15
  • 打赏
  • 举报
回复
^_^,(to rtdb)谢了,希望你能够补充下具体的想法。交流下
rtdb 2004-10-15
  • 打赏
  • 举报
回复
呵,失礼了,楼主善于总结经验教训,大有前途
rtdb 2004-10-14
  • 打赏
  • 举报
回复
楼主看起来更像是搞理论研究的。
你的这些想法都是正确的,确实是指导我们进行软件设计与开发的理论基础。

只是过于泛泛了一些。好象你准备写一个非常通用的东西,
它像个交换机或路由器软件,又能用于WEB系统,还可能用在网游上。
我只能说,这是不现实的。

不同的系统,有不同的要求,
比如说楼上那个两个月死一次机的例子,
用在WEB系统上,则足够了,肯定没问题。
再比如扩展性,对交换机是没有意义的。
lm98725 2004-10-14
  • 打赏
  • 举报
回复
学习ing...
cheeryanhua 2004-10-14
  • 打赏
  • 举报
回复
的确有点泛泛的感觉,写这个东西的想法是来源于,最近一两年多来的一些项目的想法。
去年主要开发一些应用层的通信软件,做了个省级的通信服务器,这个项目通信方式比较多,GSM短信,PSTN ,GPRS,串口,网络等多种通信方式。数据库要求支持这个ACCESS ,SQL SERVER ,ORACLE 三种。在这个项目中由于通信方式比较多,并且用户需求变化也比较多,所以对这个扩展性方面考虑淂比较多。在这个开发淂过程中,总觉淂这个设计要考虑的问题,不够全面,很多东西不知道该怎么想,应该做成怎么样,应该考虑那些问题,走了一些弯路。
最近一年多做了这个WINDOWS NDIS下的防火墙,LINUX下的网络协议栈方面的东东。现在再想想以前开发的一些问题,觉得感触比较大。就写下了这些东西。
希望大家提提自己的看法意见,如果可以能够补充一些具体的设计想法,有时间我也会补充具体设计方面的一些自己的看法。
cheeryanhua 2004-10-12
  • 打赏
  • 举报
回复
可测试性设计
经过这几年的开发,我相信一个好的开发人员也一定是一个好的测试人员。开发人员如果不熟悉的如何进行各种测试,的确是一个憾事。
现在我们一般作的是这个功能测试。但是还有这个性能测试,稳定性测试,安全性测试,等等各个方面的测试,就不是经常考虑到了。

希望能够对这个测试方面提供相关资料。以及设计方法。
我现在想作这几个方面淂测试,1,硬件系统性能测试2。网络系统淂测试,3。操作系统的性能测试,
这三个方面有那些测试工具与技术。
cheeryanhua 2004-10-12
  • 打赏
  • 举报
回复
可维护性设计
一个系统应该便于维护管理,做了一些工程性质的项目,觉得这个维护的设计也是比较重要的,赚道荷包的MONEY,还是不要拿出去的好。^_^。
可维护性是个比较泛的话题,这个稳定性也可算是可维护性的一部分。所以我现在对可维护性作个限制,就是如何方便自己的故障诊断。以及当产品已经发送到客户以后如何进行支持。

在这个通信系统设计的过程中,我认为前期就应该考虑到可测试性与可维护性的问题。我们要考虑到如何能够提供比较丰富的信息便于用户及工程人员的错误诊断。

在开发的过程中,其实我们已经为了方便自己测试,做了相关的调试信息输出,但是很多情况下,这种调试是在开发人员内部进行的。而且这种信息是比较杂乱的,位置不确定的,信息不确定的。所以我的想法是在开发的前期,在设计的阶段,就需要定义不同的信息提示级别,有的是用于发布,有的使用与内部调试,有的是为了工程维护。在项目开展的初期,使用内部调试级别信息。其它级别的信息,保留位置,但是不提高具体信息。在测试阶段,填写发布,或工程阶段需要的信息。这个工程比较繁琐,比较麻烦。都是工作量的问题,但是不能不作。还有信息提示需要注意的是不同的产品,不同的需求信息提供的数量是不同的。比如在嵌入示产品中,由于存储空间的限制,输出信息的存储,就不能全部保存在本地,可发送到其它计算机系统进行保存。
输出信息,也需要考虑这个频率问题,比如在通信系统中,如果对每个数据包进行记录,将会对磁盘I/O造成大的压力,由于硬件的不同,这个可能会对网络I/O造成影响。所以这个量需要均衡以及测试。

还有就是自动升级功能。插件框架方式就可以提供在线方式的模块热插拔。可以在不停止全部服务的情况下,对部分模块进行升级,如果系统结构设计的好,可以将功能模块部分进行灵活的控制。
cheeryanhua 2004-10-12
  • 打赏
  • 举报
回复
现在谈谈对扩展性设计的想法:
对这个扩展性设计,最近看了下LINUX内核,以及这个windows NDIS驱动接口,以及这个APCHE的设计,感觉比较深刻。一个具有良好扩展接口的系统是相当重要的。
这三个系统,对扩展接口的都是使用了插件方式。提供了一个统一的插件管理接口,用户如果需要提供自己的扩展功能,只需要按照插件管理框架规定的接口进行开发,比如LINUX下的流控接口,协议注册接口,等等,WINDWOS下NDIS接口规范。
但是看了这些接口我有个想法,他为什么要设计这样的接口,如果在我们的系统中要实现插件的设计方式,我们应该怎样同现有的系统融合起来啦。实现接口比较容易,但是选择恰当的位置,恰当的方式来实现这个插件接口,是需要慎重考虑的。
我目前的看法是,这个扩展性是同需求相关联的,不能为了扩展而扩展,我们需要根据自己系统的特点,确定那些部分是以后可能需要进行扩展的。等确定了这个以后,也就是确定了位置后,才可以选择用什么方式来实现插件管理。目前插件管理方式我见到的一般都是用这个回调函数来实现的。具体的接口就是需要需要来管理了。插件是通过用户实现注册接口来实现的,那么我们该如何实现能够动态替换用户的模块那。比如有新的模块需要增加,原有的模块需要替换,或更新。还有各种模块应该用何种方式提供啦,在不同的平台上有不同的方式,LINUX是.SO,WINDOWS是。dll,由于平台的不同,所以模块具体的加载,卸载方式不同,但是管理的算法是相同的。

当模块增加模块的时候,首先需要检查模块是否合法,比如编码方式,版本等等。只有检查合法的才可以加载。当检查通过后,还需要检查现有系统是否有足够的资源来运行这个模块。资源检查通过后,还要判断当前模块是否有老的版本正在运行。这些都是需要仔细考虑的。还有的就是这个模块与正在运行的服务之间的关系,比如同一个模块可能被多个服务使用。那么需要更新或卸载模块的时候就需要等待或停止当前正在使用模块的服务。所以这个模块的管理我的设计包括两个部分,一个是静态模块管理,一个动态服务管理,并建立两者之间的关系。

这就是目前我对插件管理的一点想法,大家提提看法。还有一部分就是这个模块操作顺序的动态组合功能,一般是怎么进行设计。我有个初步的想法,但是还没有完善。


cryptonym 2004-10-12
  • 打赏
  • 举报
回复
工具为什么用纯c++呢,vc不行吗?mfc也不行吗? 我觉得c好。
cheeryanhua 2004-10-12
  • 打赏
  • 举报
回复
恩,希望能够谈谈具体对设计淂想法,对工具的选择,这个是在具体应用中选择的。
1)不要采用最新的技术,选择最普及的技术 。这个我也同样认为,这个风险最小。但是怎么分析这个技术的风险。
2).怎么减少对系统资源的占用,不知道你习惯用什么语言开发,这个资源的管理你通常怎么进行管理。
3)维护管理设计,界面设计是这个设计的一部分。一般对这个监控与通信部分是协作的。监控部分需要对这个通信部分显示,便于用户进行分析。通信部分提供信息给监控部分,监控部分通过监控信息来指挥通信部分的动作。

对操作系统的选择:
我现在两个系统都选择,目前的情况是由于这个WINDOWS使用操作起来比较简单,还是有很多用户喜欢使用的。我现在是基本上两个系统都开发。

开发工具:^_^,我喜欢用C,我对C++不是很熟悉,还要学习下。

对于数据库,是依据不同的用户量,不同的性能需求,还有这个价格来考虑的。还有,有那些哥么做作这个数据库连接池。能否说说设计想法。我现在只做了阻塞方式下的连接池,异步方式的连接池只作了设计,还没动手
netsys2 2004-10-12
  • 打赏
  • 举报
回复
稳定性:


1)不要采用最新的技术,选择最普及的技术
2)尽量减少对系统资源的占用。
3)不要使用花哨的界面,记住,你做的是服务器,不是前台。你的用户只有几个人。

操作系统:
尽量选择UNIX,如果要windows,尽量用2000。
开发工具:纯C++,如果有数据库,选稳定的,如ORACLE。
navy125 2004-10-12
  • 打赏
  • 举报
回复
加载更多回复(5)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧