小弟有个c# 的sockets项目,sockets服务端提供给客户端实时的数据,类似游戏中的实时数据。 小弟对做这个负载的问题没有经验,情各位高手不吝指点! |
|
接收请求的应用服务器(或者叫网关服务器),将工作异步交给另一个业务服务器去处理,等工作处理完毕回调时直接把结果发送给客户端,这样你的网关服务器就几乎没做什么耗时的工作。
不是堆砌一个中转服务器!而是“扩展一个业务服务器”。开发软件不要笨拙地总是“推倒重来”,而是要学会对外隐藏内部实现,而仅在内部扩展重构。 实际上许多系统都是这样,把业务服务器拆分到多个不同业务集群。而对外的应用服务器(或者叫网关服务器)仅负责维持稳定的长连接。 |
|
找你们架构师或者技术总监来弄吧。
你的想法从头到尾都是挨不上的。 |
|
.net 里面作分布式通常出动 wcf ,用socket除非你们的架构、编程功底极强才能够驾驭。
|
|
应该是 BeginSend,而不是 Send。 另外,如果你们真的是连单独的通讯服务都显得“拥挤”,那么可以在客户端做业务负载均衡。许多应用(包括游戏)都是这样,在登录的时候由专门的登录服务器负责为客户端找一个服务器,让这个客户端重新直连那个网关服务器。因此在登录和真正的应用服务之间有一次“跳转”,而不是让登录服务器做应用服务器。 |
|
不过,如果你不是做那种互联网草根服务,而是作企业管理信息系统服务,我建议你不要盲目学那些互联网公司的烧钱的所谓架构。那些都不符合一般的企业服务的特点!也不需要学习烧钱做网页服务、高消费运维人员的那种架构。
我觉得如果你只有1000个客户端,不妨扩展带宽、改造硬盘(是用带有SSD的机制)、扩充CPU个数和主频。因为你没有那样一盘散沙似地应用服务扩展需求,你也不可能以做一堆“网页”就能吸引大领导们的注意力,你需要把精力用来支持非常高级、酷炫、性能卓越的类似WFP或者Silverlight之类的应用。 我们很多用户,比如说只有20个真正还在发挥作用的管理信息系统(各种信息“孤岛”),却买了30多台昂贵的服务器,数台价值几十万的负载均衡器,还有无数正版软件,每上一个系统都可能被软件集成商在硬件上上狂宰一笔,而服务器平常的CPU占用率不足2%,只是当作各种文件的垃圾堆积场。这跟互联网运营商不同,上面跑的软件架构也不同。 |
|
中转模式的负载均衡,是在应用开销远大于网络开销的时候才采用的分流方案。
而推送一般都能做到O(1)的查询,开销远小于网络转发。 如果你确定你的应用开销比较大,而且没有办法优化。可以提供一台查询服务器,用于获取相对空闲的应用服务器。 |
|
没有任何互联网应用能够保证100ms的响应,你能保证的仅仅是服务器对于每个请求的处理时间低于0.00XXms。
异步并不保证响应时间,但是大量并发的情况下应该使用异步模式,而无法考虑响应时间。 带宽的消耗量,与异步还是同步没有关系。如果现在的带宽能满足需求,改变响应模式一般也无需增加带宽。 |
|
如果可能,楼主可以试试fastCSharp的TCP调用负载均衡。
可以参考demo.loadBalancingTcpCommand+demo.loadBalancingTcpCommandWeb。 |
|
100ms通常是指在一个“千兆局域网”里边使用多个客户端做压力测试访问应用服务器时的结果,而不是指互联网。
而且,当业务比较庞杂(比如说常用业务请求超过300种),特别是各种业务服务真正需要的响应时间不需要在同一个数量级上,比如说针对2个应用服务器可以提供20个业务服务器来部署5个功能不同的业务服务集群,比如说当应用服务器高效率维持tcp长连接时各业务服务器其实是异构的LAMP无状态web服务,应用服务器必须是资源占用很低的并且仅用几十个线程就能维持20万长连接的,因此很自然就“只能”是异步访问业务服务器的。 |
|
50分 |
不过我说过了,如果你是开发企业管理信息系统服务器,不建议盲目地搞多服务器架构。那不但在设计和重构上消耗大量多余累赘的精力,也会带来一堆麻烦的运维(一大堆不同东西的部署、动态更新、启动停止、跟踪机制)问题,最终效率也未必很高。
还不如提高服务器本身的能力,提高服务应用软件本身的能力。 我遇到一个企业多个核心业务服务系统软件开发,老板在2年多之间只投入一个普通程序加一个中专实习生的研发费用,却在最后用“带有不屑的表情”去要求服务系统要拆分程序多个服务器联邦架构,这种要求简直是“高大上”到了坑人的地步。所以也不要盲目道听途说什么“大型互联网公司的架构师”们的忽悠,还是要从最近半年、一年的实际格局出发来进行设计。 |
2年多之间只投入一个普通程序加一个中专实习生的研发费用 –> 2年多之间只投入一个普通程序员加一个实习生搞所有研发和维护
|
|
谢谢你的耐心回答! |
|
谢谢,100ms是个平均值。目前连接都是基于socket的beginSend … 这些,服务端是基于IOCP的完成端口模式。测试下维持众多客户端连接估计问题不大,现在主要担心延迟问题。 |
|
sp兄说的,不管是企业还是个人成长,根据实际,由小做大,由浅到深进阶。
|
|
基于LZ的问题 我建议你还是先别谈什么 集群以及负载均衡了..
目前这些你都用不到.. 因为你连基本的,可扩展的,稳定的socket服务都没有写好.. 甚至连思路都不是很清晰.. 所以我建议你还是先从基础入口 比如看看socketasynceventargs以及异步以及线程池什么相关的. 然后写出Demo 测试下承受能力.在来讨论 PS:你那客户端有多少? 如果5W之内的话就别讨论什么集群以及负载均衡了.随便的异步都能支持几万的… |
|
呵呵,现在像你这样的人太多了,眼高手低,我这个项目是花了不少钱请的团队做的,里面不乏经验丰富的人,不过他们当时夸口还比不上你,他们跟我说3000并发绝对没问题。不错,做出来后若论只要连接上能通信这样也叫做并发,这有什么用。项目要求每个请求在100ms内服务器要回应,最后的结果100个人集体每隔50ms发送请求,收到服务器回应很多超过300ms,这和服务器挂了还不是一样。 |
|
最后的结果100个人集体每隔50ms发送请求,收到服务器回应很多超过300ms,这和服务器挂了还不是一样。 |
|
楼主这是把网游当单机玩呢?每秒10个请求,有任何必要吗?
而且,你到底是服务器向客户端推送数据,还是客户端主动请求啊,测试的时候,100个人每50ms请求一次,这是闹哪样 你到底是要自己做项目,还是花钱买项目? 花钱买的项目不符合心意,去找你所谓的团队,让他们改进啊 也不知道你请的团队到底有几个人. |
|
随便写了几行代码 用测试工具测试了下..
3000并发间隔50ms效果如下 当然效果可能不尽人意因为随手玩的 socket对我来说 我很陌生的 初学不到2个月 我想 你所谓的不少钱的团队至少比我个人厉害多了吧. 不如拿测试工具说话如何呢? |
|
楼主的程序,保证去查询数据库了,不是仅仅收到请求就直接应答的模式. |
|
团队是5个人,当然不可能说5个人都做通信,他们内部自己分工的。 |
|
记得一月前你回帖,你那时连同步异步,队列等都搞不清。如果你一月前开始学到现在,学了2个月我倒是相信, 不过我还是很高兴看到你去实测。只是你那样的测试,让我想起我读书的时候老师让我们做的测试一样。 |
|
既然你认为我的测试没有说服力,或者说我没有实际在项目中应用我也没办法了,.
就算我说过我用”别人的框架”做了高效的server支持N连接N并发你也不信了.. 还是那句话..先做出来.现在讨论那些所谓的”框架”,”架构”都是没用的.. 如果连基本的”东西”都没有,上来就数据库集群.服务器集群.复杂均衡 CDN一大堆高端的词语 真的没什么意思. 就好比最近看到一个帖子(忘记时间了),可能LZ连基本的页面都做不出来就想着高并发大数据各种缓存,, 反正我觉得这没什么意思.. 另外问下您现在如何测试(模拟)tcp_client做数据收发并发操作?求软件名称 |
|
看到你文中说到 你是花大钱找的团队开发的?
我一直认为能做游戏服务器的team都是大神 既然叫团队 既然花钱 他们一定会给你一套完美的解决方案.. 你是甲方啊..这点要求还没有…而且你又不用参与编码..这些他们来完成都是分内的事.. 难不成你是乙方.. |
|
学到了很多,谢谢各位牛人
|
|
呵呵,loadrunner |
|
花大钱是不能说的。 所以当你上次回帖跟我炫耀什么框架,我都懒得回你。 |
|
通信跟供电不一样,拿个万用表测一下电压电流电阻,到底出了什么问题就一清二楚了
通信瓶颈有很多的可能性 从你的描述,最大的可能性是出在数据库通信上 你的socket哪怕能支持上亿人在线,你的数据库能支持上亿用户同时访问吗? 你数据库通信的时候,数据量大不大,SQL语句执行效率高不高,会直接影响查询效率 SQL语句做的太烂,很有可能使100ms能返回的数据,整整30秒都没动静 |
|
10分 |
还有,对于重复数据,是否有缓存的技术
就是给客户端推送数据的时候,其实只去查一次数据库,就可以把同样的数据推送给3000个客户端 而不是每个客户端请求都要去查一遍数据库 如果数据库这里不做优化,哪怕你服务器变成100个服务器构成的集群,你的数据库还是只有一个,那么网络通信这里再牛逼,数据库通信依然是瓶颈所在 |
还有,如果1台服务器能够支持300用户正常访问(就是你说的100ms之内)
并不是说简单的增加99台服务器,就能支持3万用户正常访问了 你什么都不做,仅仅是把程序copy了99份,那么不同的客户端就必须去访问不同的服务器(IP不一样) 至少你要有个负载均衡服务器,还要把数据库也分开成N份,去分别访问 |
|
此贴不错! 学习学习
|
|
你说得对。很大成分也许是出在数据库上。目前我按前面sp1234说的,增加硬件配置增加带宽。 |
|
才看到这个帖子,很受益,不知道博主是怎么解决这个问题的。我QQ1097430564 希望能得到您的回复,因为我最近在看一些集群的资料,但是很少,现在做的一个C/S内网聊天的软件,想考虑做成集群,资料说用MEMCHASHED做集群,不知道怎么解决。希望有大神能够给出思路。
现在我考虑遇到的问题是这样,TCP通信时候我是长连接,如果我多台服务器运行C1想与C2通信,但是C1的消息发给了S1,C2的小心发给了S2,这样怎么实现P2P,有资料说用一个中转服务器只负责监控SESSION状态,请问具体应该怎么实现。 第一次发帖,有点语无伦次,希望大家指证和教导,谢谢! |