请教关于socket服务器集群,负载均衡......

wwwww112233 2014-10-03 08:06:14
小弟有个c# 的sockets项目,sockets服务端提供给客户端实时的数据,类似游戏中的实时数据。
但是,现在估计到如果人数很多,担心服务器扛不住【要求服务器的响应时间是100毫秒内】。
目前是一个服务端,整个系统工作原理是这样:
客户端订阅某个货品的即时数据,服务器保存了所有客户端的socket,根据客户端的订阅,实时的向客户端发送数据,直到客户端取消订阅。
想请教2个问题:
1,如果几百个客户端都订阅用一个货品,现在服务端是for循环一个一个send过去(使用beginSend...)。不知道这样会不会延迟?除了增大带宽想不到别的好办法。
2,考虑到货品本身的信息也很多,所以想增加几台服务器。当A服务器压力大的时候,就让B服务器一起提供服务。
但应该怎样协调这些服务器呢?
目前考虑是:
1)增加一台中转服务器,当接收到客户端请求时候,中转服务器向一台压力不大的服务器请求数据,得到数据后转发给客户端。
但是这样的话,岂不是所有数据都要这个中转服务器来发送,这样中转服务器是否压力大?
是否有办法,当中转服务器选择了一个服务器后,让这个服务器直接向那个客户端发送数据而不必中转?或者当某个服务器压力大的时候,自动转移一部分客户端的socket交给别的服务器去承担?

小弟对做这个负载的问题没有经验,情各位高手不吝指点!
谢谢!!
...全文
6836 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
吾乃水镜 2016-12-07
  • 打赏
  • 举报
回复
初步阅读,排序感觉应该是:beginSend异步模式、IOCP端口模式、提升服务器硬件性能、设置查询服务器、中转模式、fastCSharp(抱歉,把这个排在最后是因为我不喜欢用别人做好的东东)
季雨林 2016-02-01
  • 打赏
  • 举报
回复
不错的帖子,同样研究socket的表示膜拜!
ld3838029 2016-01-14
  • 打赏
  • 举报
回复
mark,好帖
liu8421353 2015-04-28
  • 打赏
  • 举报
回复
才看到这个帖子,很受益,不知道博主是怎么解决这个问题的。我QQ1097430564 希望能得到您的回复,因为我最近在看一些集群的资料,但是很少,现在做的一个C/S内网聊天的软件,想考虑做成集群,资料说用MEMCHASHED做集群,不知道怎么解决。希望有大神能够给出思路。 现在我考虑遇到的问题是这样,TCP通信时候我是长连接,如果我多台服务器运行C1想与C2通信,但是C1的消息发给了S1,C2的小心发给了S2,这样怎么实现P2P,有资料说用一个中转服务器只负责监控SESSION状态,请问具体应该怎么实现。 第一次发帖,有点语无伦次,希望大家指证和教导,谢谢!
xhz8000 2014-10-10
  • 打赏
  • 举报
回复
此贴不错! 学习学习
於黾 2014-10-10
  • 打赏
  • 举报
回复
还有,如果1台服务器能够支持300用户正常访问(就是你说的100ms之内) 并不是说简单的增加99台服务器,就能支持3万用户正常访问了 你什么都不做,仅仅是把程序copy了99份,那么不同的客户端就必须去访问不同的服务器(IP不一样) 而且数据库还是只有一个,这始终会是瓶颈 至少你要有个负载均衡服务器,还要把数据库也分开成N份,去分别访问
於黾 2014-10-10
  • 打赏
  • 举报
回复
还有,对于重复数据,是否有缓存的技术 就是给客户端推送数据的时候,其实只去查一次数据库,就可以把同样的数据推送给3000个客户端 而不是每个客户端请求都要去查一遍数据库 如果数据库这里不做优化,哪怕你服务器变成100个服务器构成的集群,你的数据库还是只有一个,那么网络通信这里再牛逼,数据库通信依然是瓶颈所在
於黾 2014-10-10
  • 打赏
  • 举报
回复
通信跟供电不一样,拿个万用表测一下电压电流电阻,到底出了什么问题就一清二楚了 通信瓶颈有很多的可能性 从你的描述,最大的可能性是出在数据库通信上 你的socket哪怕能支持上亿人在线,你的数据库能支持上亿用户同时访问吗? 你数据库通信的时候,数据量大不大,SQL语句执行效率高不高,会直接影响查询效率 SQL语句做的太烂,很有可能使100ms能返回的数据,整整30秒都没动静
wwwww112233 2014-10-10
  • 打赏
  • 举报
回复
引用 31 楼 Z65443344 的回复:
还有,如果1台服务器能够支持300用户正常访问(就是你说的100ms之内) 并不是说简单的增加99台服务器,就能支持3万用户正常访问了 你什么都不做,仅仅是把程序copy了99份,那么不同的客户端就必须去访问不同的服务器(IP不一样) 而且数据库还是只有一个,这始终会是瓶颈 至少你要有个负载均衡服务器,还要把数据库也分开成N份,去分别访问
你说得对。很大成分也许是出在数据库上。目前我按前面sp1234说的,增加硬件配置增加带宽。
wwwww112233 2014-10-09
  • 打赏
  • 举报
回复
引用 25 楼 diaodiaop 的回复:
看到你文中说到 你是花大钱找的团队开发的? 我一直认为能做游戏服务器的team都是大神 既然叫团队 既然花钱 他们一定会给你一套完美的解决方案.. 你是甲方啊..这点要求还没有...而且你又不用参与编码..这些他们来完成都是分内的事.. 难不成你是乙方..
花大钱是不能说的。 只是我实在烦透了那些夸大其词的人,有的时候浪费点钱也就算了,但误了事却麻烦的多。 为什么对你有点火大,当然主要是我个人的问题,感觉你说话的语气像极了那个公司的宣传那个人。 事情没定的时候,拿出一些之前的案例,什么几千几万并发,5年8年经验,负载、压测,专业美工。 结果到做的时候,我查看了一些代码,东拼西凑,和你现在一样拿着别人开发的现成框架拼凑一下以为好牛逼, 由于平时是自娱自乐,当然发现不了bug,好比你现在测试说5w并发一样。结果实际问题一堆, 不然如你所说我何必来关心编码呢。在socket通信这块,如果不是项目有严苛的要求,很多 小问题小bug你自己或许n年都不知道它的存在。 所以当你上次回帖跟我炫耀什么框架,我都懒得回你。
wwwww112233 2014-10-09
  • 打赏
  • 举报
回复
引用 24 楼 diaodiaop 的回复:
既然你认为我的测试没有说服力,或者说我没有实际在项目中应用我也没办法了,. 就算我说过我用"别人的框架"做了高效的server支持N连接N并发你也不信了.. 还是那句话..先做出来.现在讨论那些所谓的"框架","架构"都是没用的.. 如果连基本的"东西"都没有,上来就数据库集群.服务器集群.复杂均衡 CDN一大堆高端的词语 真的没什么意思. 就好比最近看到一个帖子(忘记时间了),可能LZ连基本的页面都做不出来就想着高并发大数据各种缓存,, 反正我觉得这没什么意思.. 另外问下您现在如何测试(模拟)tcp_client做数据收发并发操作?求软件名称
呵呵,loadrunner
by_封爱 版主 2014-10-09
  • 打赏
  • 举报
回复
基于LZ的问题 我建议你还是先别谈什么 集群以及负载均衡了.. 目前这些你都用不到.. 因为你连基本的,可扩展的,稳定的socket服务都没有写好.. 甚至连思路都不是很清晰.. 所以我建议你还是先从基础入口 比如看看socketasynceventargs以及异步以及线程池什么相关的. 然后写出Demo 测试下承受能力.在来讨论 PS:你那客户端有多少? 如果5W之内的话就别讨论什么集群以及负载均衡了.随便的异步都能支持几万的...
绿领巾童鞋 2014-10-09
  • 打赏
  • 举报
回复
sp兄说的,不管是企业还是个人成长,根据实际,由小做大,由浅到深进阶。
solointer1980 2014-10-09
  • 打赏
  • 举报
回复
学到了很多,谢谢各位牛人
by_封爱 版主 2014-10-09
  • 打赏
  • 举报
回复
看到你文中说到 你是花大钱找的团队开发的? 我一直认为能做游戏服务器的team都是大神 既然叫团队 既然花钱 他们一定会给你一套完美的解决方案.. 你是甲方啊..这点要求还没有...而且你又不用参与编码..这些他们来完成都是分内的事.. 难不成你是乙方..
by_封爱 版主 2014-10-09
  • 打赏
  • 举报
回复
既然你认为我的测试没有说服力,或者说我没有实际在项目中应用我也没办法了,. 就算我说过我用"别人的框架"做了高效的server支持N连接N并发你也不信了.. 还是那句话..先做出来.现在讨论那些所谓的"框架","架构"都是没用的.. 如果连基本的"东西"都没有,上来就数据库集群.服务器集群.复杂均衡 CDN一大堆高端的词语 真的没什么意思. 就好比最近看到一个帖子(忘记时间了),可能LZ连基本的页面都做不出来就想着高并发大数据各种缓存,, 反正我觉得这没什么意思.. 另外问下您现在如何测试(模拟)tcp_client做数据收发并发操作?求软件名称
wwwww112233 2014-10-09
  • 打赏
  • 举报
回复
引用 19 楼 diaodiaop 的回复:
随便写了几行代码 用测试工具测试了下.. 3000并发间隔50ms效果如下 当然效果可能不尽人意因为随手玩的 socket对我来说 我很陌生的 初学不到2个月 我想 你所谓的不少钱的团队至少比我个人厉害多了吧. 不如拿测试工具说话如何呢?
记得一月前你回帖,你那时连同步异步,队列等都搞不清。如果你一月前开始学到现在,学了2个月我倒是相信, 看来你进步很大。 但是劝你一下,你不要捡个别人现成写好的服务框架就觉得如何如何,借用别人的开源服务可以,但你会发现实际中还有 很多东西不是你那样想当然。 不过我还是很高兴看到你去实测。只是你那样的测试,让我想起我读书的时候老师让我们做的测试一样。
wwwww112233 2014-10-09
  • 打赏
  • 举报
回复
引用 18 楼 Z65443344 的回复:
楼主这是把网游当单机玩呢?每秒10个请求,有任何必要吗? 而且,你到底是服务器向客户端推送数据,还是客户端主动请求啊,测试的时候,100个人每50ms请求一次,这是闹哪样 你到底是要自己做项目,还是花钱买项目? 花钱买的项目不符合心意,去找你所谓的团队,让他们改进啊 也不知道你请的团队到底有几个人.
团队是5个人,当然不可能说5个人都做通信,他们内部自己分工的。 他们已经改进不了了..... 服务器收到数据后经过数据库处理再返回,主要在于他们难以排查或者他们也不愿去找原因,他们认为只要运行不挂就算 完成任务了。 作为我这边来说,如果一台服务器能保证100-300人高效稳定通信,大不了多买几个服务器即可。所以现在询问一下集群。 我个人认可前面sp1234的说法。
dd_zhouqian 2014-10-09
  • 打赏
  • 举报
回复
於黾 2014-10-09
  • 打赏
  • 举报
回复
引用 19 楼 diaodiaop 的回复:
不如拿测试工具说话如何呢?
楼主的程序,保证去查询数据库了,不是仅仅收到请求就直接应答的模式.
加载更多回复(17)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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