高分求教!有经验的哥们请入!大量数据连接对服务器的影响如何?(200分)

  • 主题发起人 主题发起人 mopege
  • 开始时间 开始时间
M

mopege

Unregistered / Unconfirmed
GUEST, unregistred user!
现在我有一个C/S结构的程序,客户端有很多,最大可能达到数千(<5000).平均的话我估计也有1000左右.
如果每个客户端都跟服务器建立一条tcp连接的话,那么服务器会垮吗?如果不会垮,那么对服务器的影响有多大?
有经验的大侠讲讲相关经验吧.
p.s. 服务器端是sunfire 480 solaris,java编程.客户端是windows,delphi编程.
 
如果只是TCP连接多,数据传输量不大,影响不大,不过对服务资源的占用也不无影响。
 
我现在就是想知道,影响究竟有多大啊.
有没有哪位老大做过这方面压力测试方面的东西,出来讲讲吧.
 
我作过并发1000的压力测试,不过不是C/S数据库方面的应用,是SOCKET服务器,
如果Client连续的发送请求,CPU占用90%左右,还算问题。
 
啊,看来我的问题描述的还不够仔细,sorry啊.
其实在我的程序中,客户端并不需要向服务器端发送请求,是服务器端定期的向客户端发送消息.
因此服务器端有必要保留客户端的连接信息.
那么在这种情况下,问题会怎么样呢?
张无忌,其实我的也是socket通信的程序啊.你估计我的系统会有太大毛病吗?
一般来说,服务器端保留一条连接,那么占用了系统哪些资源呢?
另外,我的服务器上面还要跑一个sun的j2ee应用服务器,一个oracle9i和一个j2ee应用(^_^,累死它!),所以这个C/S应用占用率可不能太高,否则我就只能另觅它途了.
 
你可以使用UDP,不保留连接
 
to lich
使用UDP是一个办法,但是存在两个问题:
1.UDP是无连接的,所以无法保证消息正确传递.如果想要保证消息的确正确送达,那么就必须设计一套协议.好像qq就是这么做的.我已经考虑过了,由于我的系统的一些原因,这套协议异常麻烦.
2.很多防火墙直接就禁用了UDP端口.这是最致命的.
 
呵呵,还是用TCP好, 稳定,可以控制。就是编码所谓麻烦点
 
我现在最害怕的就是,一旦我决定了采用某种方式,结果到了上线的时候却发现根本不能用,甚至动不动就搞垮了服务器,那我就死定了,肯定全部都要重做.
那时候我可就玩完了.
所以我现在必须慎重考虑,然后采用最合理的方式.
大家给点建议吧.
分数我有的是,两三千分呢.
大家来讨论一下吧.
哪怕是提供一些思路都行.我会另开帖子散分的.要多少都可以.
 
socket其实很耗费资源,tcp更加如此
java写服务端的话,你或许应该用一个servlet处理
如果全部自己写的话,可能效能不好
普通机器,加上部分数据库处理,用较好的架构(串行处理数据请求,并行接受sock连接,保存每一对sock连接)的话,我的一次测试也就3、4百个。
尤其是还有oracle和j2ee服务在上面。
--------------------------------------------------
设计方式上来说,我觉得,用服务器静态保持每一个连接,是很不好的,特别是针对你的情况(数据少,有周期性)。这样的设计有问题。
--------------------------------------------------
我建议你:
每当服务器有信息需要发给客户端的时候,建立socket去连接客户端;启动的客户端主动开一个监听端口(他不怕浪费:)),等待服务器连接,连上即接受数据,然后中断连接。
在服务器上面可以保存客户的部分信息(如ip,在线状态,更新标志等内容),每次发送消息前读取客户列表,逐次发出,更改标志。对于不可到达的客户,不更新标志,从而在以后可以重发,以保证客户得到更新。

不完善之处,欢迎指正
 
初步:
终于有人肯认真对待这个问题了.
你的方法应该是可行的.我以前就做过相关的东西,采用的就是这种方法.
这样做肯定有些问题的.比方说,如果客户端非正常关闭,没来得及向服务器端发送离线消息的话,那么服务器端就会遇到麻烦.同时,防火墙做出更多的开放.这方面客户肯定有意见的...
另外,你说的"java写服务端的话,你或许应该用一个servlet处理.如果全部自己写的话,可能效能不好",我不是很明白.
现在我为了避免对应用服务器造成过多的影响,我刚刚决定做一个独立与应用服务器的应用程序呢.
能详细说说吗?
 
其实,c/s的架构,然后只需要服务器向客户端发送信息的话,应该不需要用tcp连接!或许可以这样想,每次客户端上线,服务器就登记客户端的地址,然后采用udp协议,每次服务器要发信息的时候,用udp发送,然后可以等待客户端返回一个确认信息,在这里可以自己设置一个时间间隔,超过时间没有反应,重新发送,超过了你规定的发送次数,没有回音,应该是客户端掉线拉,这样服务器就继续发送信息给下一个客户端,这样服务器应该负荷不是很大!而且,也可以保证客户端可以收到信息!
不知道我有没有理解错您的意思!!呵呵!!
 
我的C/S设计是Client主动向Server发请求,由 Timer控制,Client根据不同的
情况向Server发送不同的请求,全部请求基于2进制结构,虽然阔从性差点,但
是速度快,而且服务器可以做成无状态的(密码认证除外),利用异步I/O的强
大并发能力,处理1千个并发连接效果还不错。不过SUN的unix不知道支持AIO如
何。如果能利用AIO的强大能力,做成一个支持巨量Client用户的服务器是可能
的。
 
请改换B/S结构。。。
工作量大了些。。。
 
(一)服务器主动连接客户端
我觉得最主要的一点,是建议不要一直保持tcp连接,TCP永久连接的开销是可怕,连接数损失也很大
你可以参考ftp协议的实现,多开一个服务端口,向客户端的知名端口发消息
无论何时,都要假设客户端或者服务器都可能掉线或者意外不可用,所以,记录在线状态一般来说没有多大意义,但是可以改成为类似上次登陆时间等信息,在每次发送消息之前都要求检查是否可以建立连接,以便得到最新的有效状态。而且,你或许应该建议ip和业务用户之间的对应关系。
当然,应该收到消息的客户端并未启动也会时常发生,所以应该有考虑
(二)客户直接连接服务器的方式
建议服务器用一个servlet接收, 客户端delphi用http协议收发数据,body中可以放XML数据, http连接属于短连接模式,也好扩展,所以容量比较大,一般可到5000以上


 
可是使用多个服务器,
做成两级的,
由主控服务器,向其它服务器发送命令,
每个二级服务器负担一定数量的客户端,
使用UDP协议,无需建立连接,开销小,
但是需要验证,保证消息的可靠传递,
采用最简单的发送应答方式,保证消息可靠传递
 
如果是想测试性能的话,写一个程序,一起动就建立10个连接,一台机器起它10个进程,用10台机器测试,正好1000个连接。
 
楼主都不见拉,可能是问题解决啦,留下我们在这里瞎扯!!
 
楼主也要下班的啦.
lich说的方式很有趣,但是太复杂了,做成这种分布式的东西倒是个好想法.
大家说的很好.
只是人气还是不足.
我结了吧先.
 
后退
顶部