关于用DELPHI开发服务器软件中的一些经验(100分)

至于为什么不使用string的原因我前面已经说过了,这个softdog也是同意的,至于你说
我是建议你做一些大规模的压力测试才知道string的问题,呵呵,先把帖子读仔细了,再
回帖子把
 
张无忌做的是并发负荷很大的系统(听闻1000以上,换算到客户端数量肯定在几万以上,而weblogic这样昂贵的产品,它的servlet容器,单个servlet承受数千发访问都是很需要考量考量的,至于EJB就不太清楚),我想他考虑的出发点就比我们高得多.他考虑的方式,对他作的系统来说,的确是十分要注重的,甚至是绝对要那样做的.
使用String肯定会有代价的,这个应该不用怀疑,不说他执行的增加/删除引用计数这样额外的执行代码,他本身就多占了一个引用计数(8字节)和一个长度(4字节),算起来一个字符串起码就多分配了12字节.这个是不是很浪费?说不好的,就好比小马过河,老鼠说河很深,老说河很浅,究竟是深是浅,要相对小马来说才正确.同样是做服务器开发,有的很大的系统,有的是很相对较小,有的系统硬件和普通架构足够应付,而十分注重业务实现,有的业务相对简单,但却极重系统的稳定性,可能考虑的时候就各有出发点.
又说了一通废话,不过我现在觉得,程序员代码水平固然是很重要,另一方面的水平则更重要,就是分析代价和所得,说穿了吗,就是用最少的力气谋取最大的利益,咱们写程序,无论说得多好听,爱好写程序啊,为了理想啊,为中国软件崛起啊,都是假话,其实都是谋生赚钱.所以具体到软件架构,也肯定要考虑一下.也不是说一定要都用现成的东东或者简单的东东,服务器系统程序除了开发成本,也有维护成本等等.比如大家都知道用.net开发,开发速度快,开发成本就很低,但用这个架构的东东目前就比较少,其中少不了维护成本的考虑.
我个人没有做超大系统的机会,所以我考虑问题就远不如张无已要求那么高.如果我有机会做大系统,我一定向张无已多多讨教学习.
我个人看贴子,并不会随便反对别人的意见,因为我觉得每个人提出的意见,都肯定是有过思考的,这个贴子中每个人的贴子都有道理,都有学习的地方,只是大家出发点并不尽相同.
大家继续,我好多学习学习,特别是我没有条件亲手去体会的东东....
 
另外推荐用delphi做中小分布式系统的delphi朋友有空试试remobjects,我目前正在试玩,感觉有点小意思,他的服务器端支持isapi dll,cgi,apache dso,dxsock /indy独立服务器,windows messages...
Asta有一个bug,他的客户端数据集ApplyUpdate有个逻辑问题,在生成的sql未更新到原记录时(where匹配不到原记录,也就是原记录已被修改),客户端仅仅刷新记录,不抛发异常,关键应用的话是不能容忍的.而datasnap可以准确地抛发一个Data update by another异常.
其实我知道我玩的都是些旁门左道,不是主流,玩这些是为个人用的.我在公司用的则是java做服务器,目前应用是部署在weblogic上,客户端是用delphi.使用webservices进行远程调用.有兴趣的朋友可以交流交流.
 
不知道各位注意没有,现在大部分的服务器软件都是用VC写的,我不清楚是为什么?
唯一的一个是Serv-U是用Borland的C++写的。
 
我感觉出现这种情况是大部分用DELPHI的开发人员对细节和效率不重视,什么方便用什么
而且大部分习惯用第三方控件,没有一定的低层开发能力所导致的结果,其实还是有一些
服务器软件是用D写的,我看做FOXMAIL的张小龙公司的一些EMAIL服务器就是用D写的,
而且全部都是用API写的,包括一些GDI界面都是API写的,
 
用 indy 写服务器程序,然后运行在 linux 下
是不是也是个方案呢?
因为很难看到windows服务器可以一个月不重起的,
而 linux 却可以一年运行而不重起。
 
http://expert.csdn.net/Expert/topic/2467/2467236.xml?temp=.2988245
这个也是类似的
其实说来说去只要一句话就可以解决, 那就是具体问题具体分析

2003-12-12 20:00:25 张无忌
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2342105

2003-12-12 20:08:22 张无忌
老大,看完没?

2003-12-12 20:07:52 tseug
快了
[↑]

2003-12-12 20:08:41 张无忌
恩,

2003-12-12 20:08:06 tseug
玩了
[↑]

2003-12-12 20:08:53 张无忌
好快

2003-12-12 20:08:35 tseug
说来说去都是一个度的问题
[↑]

2003-12-12 20:09:30 张无忌
,如何是个度的问题?

2003-12-12 20:09:45 tseug
我是做工程的,在工程上进度是一个和质量同样重量的概念,尤其是大系统工程
[↑]

2003-12-12 20:11:35 张无忌
恩,很多时候项目完成速度快不一定能满足设计

2003-12-12 20:11:02 tseug
有的时候为了保证进度, 对于不是很把握的是事情都有备用方案, 对于软件, 有可能花大价钱买商用的
[↑]

2003-12-12 20:12:15 张无忌
恩,看来做一些这个方面的东西还是有好处的,哈,

2003-12-12 20:11:44 tseug
对, 在工程上所以有一个整改和缺陷责任期的概念
[↑]

2003-12-12 20:12:50 张无忌
具体如何,说来听听

2003-12-12 20:13:21 tseug
整改就是在基本功能保证的前提下有一定的修改时间,是更换,或者重新做什么的
[↑]

2003-12-12 20:14:26 张无忌
恩,我们这边也有这个概念

2003-12-12 20:14:08 tseug
缺陷责任期是在项目验收合格之后有1年-2年的免费维护期间
[↑]

2003-12-12 20:15:20 张无忌
恩,这个都是这样的,我们这边是一年的免费维护以后收钱

2003-12-12 20:14:42 tseug
对,这个就是从大的制度上来保证项目成功的方式
[↑]

2003-12-12 20:15:44 张无忌
这个和哪个帖子有什么关系了?

2003-12-12 20:15:26 tseug
所以, 快速的拿出产品或者完成项目是主要的
[↑]

2003-12-12 20:16:41 张无忌
但是东西不定期死机可是比较讨厌的

2003-12-12 20:16:17 tseug
对于不同的人, 技术水平不同, 完成同样的功能会采取不同的手段, 这些都是合理的选择
[↑]

2003-12-12 20:17:12 张无忌
B也对

2003-12-12 20:16:42 tseug
呵呵, 就连有的路由器都有这个毛病
[↑]

2003-12-12 20:17:34 张无忌
哦,具体说来听听

2003-12-12 20:17:13 tseug
其实, 设计本来就是一个折衷的过程
[↑]

2003-12-12 20:18:01 张无忌
恩,也对

2003-12-12 20:17:34 tseug
路由器也是一个小的服务器程序阿
[↑]

2003-12-12 20:18:25 张无忌
也对

2003-12-12 20:18:32 tseug
那么在不确定的情况下的选择只能是尽量往好的地方努力
[↑]

2003-12-12 20:19:32 张无忌
恩,不过稳定的程序难做啊,

2003-12-12 20:19:40 tseug
比如发现自己开发可能会延误进度,影响下一个项目的投标, 那就有可能花更多的钱来买一套
[↑]

2003-12-12 20:19:55 tseug
对, 需要时间,
[↑]

2003-12-12 20:20:35 tseug
自己代码里的问题容易解决,但是某些库函数的问题很麻烦
[↑]

2003-12-12 20:21:32 张无忌
而且需要时间测试,我现在的服务器程序可以保证开一个月不出问题

2003-12-12 20:21:22 tseug
呵呵,利害,
[↑]

2003-12-12 20:22:49 张无忌
我都是用API函数包括字符串处理,压力测试的时候我是1000个并发,

2003-12-12 20:22:45 tseug
恩,不过如果代码不是很复杂可以考虑白盒测试
[↑]

2003-12-12 20:23:59 张无忌
我在一个关键位置用string表示,结果才10分钟就内存异常了,哈

2003-12-12 20:23:47 tseug
不会吧,String没那么脆弱,不是你用错了吧
[↑]

2003-12-12 20:25:04 张无忌
没有我只是用Format函数

2003-12-12 20:24:54 tseug
不会吧,怎么写的?
[↑]

2003-12-12 20:26:17 张无忌
哪个压力很大的啊,1000个客户线程,才半个多小时,就发送了6G数据

2003-12-12 20:26:04 tseug
你的String是局部变量吧?
[↑]

2003-12-12 20:26:55 张无忌
就是
write(F,Format('%d类型消息',[itype]));

2003-12-12 20:26:40 tseug
呵呵,碎片太多了
[↑]

2003-12-12 20:28:27 张无忌
是啊,我后来改用StrFmt就一切OK了

2003-12-12 20:28:39 tseug
呵呵,Format有很多动态分配的东西
[↑]

2003-12-12 20:30:00 张无忌
是啊,里面开始是分配一个String然后在里面有重复分配的东西,

 
没有发现String类型不稳定或不可靠的地方,
我进行了一个简单的测试,用的就是Format函数
开了40个线程(机子速度有限,开多了会特别慢)
连续运行2小时41分钟(这个是CPU总占用时间),
没有任何错误,
内存使用也没有丝毫的增加,

即使Format函数有问题,也不能说String类型不可靠
也不能因为一个函数内部多次分配释放空间就说这个函数有问题

所以,我认为无忌兄所说的问题太过于武断,
难免会误导大众(毕竟张兄是大富翁颇有名气的人物),
说话还是要注意影响的,

即使有100个人同意你的看法,
但是,我想,你还是要拿出直接的证明来
才容易让人信服啊!
 
麻烦问一下,如何进行大连接测试的?
 
驱动程序、游戏、算法动态库(比如h263)--------------------->vc
数据库、通用软件 ----------------------------------------->delphi
服务器、特别复杂的客户软件-------------------------------->c++builder
web程序或老板要求----------------------------------------->java、c#
第一个学习的语言、加密、速度及接口要求-------------------->汇编

vc的不足:mfc
delphi的不足:api的转换,STL库
c++builder的不足:系统庞大,编译速度稍慢
java、c#的不足:非机器原生代码,不可以自己控制所有事情,不适合通用和系统软件。

 
TO lich:
我当时的测试是在服务器运行了很长时间以后进行的,Format函数的主要问题是容易产生
大量的脆片,你看他的原代码就知道了,我当时的测试是大量并发连接都调用一个Format
函数,这个函数里面有字符串处理和数字显示,同时把这个string写到文件里去,可能是
生成的字符串是变长的,导致产生了大量的脆片最后程序崩溃了。
 
同时,在一般情况下Format没有什么问题,我的测试服务器平时开了10多天都没事情的,
每天最多并发也就几十个人,但是压力一大,时间一长就出了问题。
 
我想使用线程池可以避免重复分配资源,那 string 就不会总是重复分配内存了
在 indy 里,我在服务器端的线程里分配很多东西,如果不用线程池,那么就非常慢,
用了线程池,就没有任何问题了。

不好意思,刚刚接触一点网络编程,想通过这个帖子学习一下 :)
 
楼上的,我为什么要告诉你?[:D]
 
咋的了,这是,说着说着就斗起来了,没意思哩,技术上见真章呗,有啥想不开呢?
憋气的话就想想人家萨达姆,俺们比起他来,要幸福多了呢。
 
无知者无惧!
我佩服![:(]
 
顶部