本帖最后由 ggbb190 于 2009-09-23 22:13:29 编辑

解决方案 »

  1.   

    web程序用一台服务器,数据库用N台服务器,表分区放在不同服务器上
      

  2.   

    均衡负载我还没研究过,我们有个街灯照明的系统,就是一台工控机服务器,现在挂300个还行,配置一般。
    win2000 mysql 但是这个是为每一个终端开一个端口,不知道什么原理,为什么这么做?
    难道这就是传说中的完成端口??????那个是原来的人员做的,都走了,什么都没有,没有源码,只有使用说明。
      

  3.   

    远程抄表这种觉得实时性不是很强。
    应该采用连接发送响应关闭。
    如果所有连接都不关,毕竟不是一个好想法。
    考虑到伸缩性IOCP也就是完成端口。不过c#做完成端口,好像没有现成可调用的
      

  4.   

    流量大一般都做集群和均衡负载的,
    web程序可用台服务器,数据库用N台服务器,表分区放在不同服务器上
      

  5.   


    貌似2.0新加的SocketAsyncEventArgs封装了IOCP,但例子非常少。
      

  6.   

    是啊,公司转型准备3年后年产值上亿,可是研发人员就那么几个,对我来说到这倒是一次检验自己的机会,去年金融危机后就来这了,开始想在这学学产品研发流程,现在不仅了解这个,整个公司都熟悉了,并且代替原来的研发人员成为研发组长,负责平台服务端、管理的设计,可以说除了立项和电力通讯协议需要有人支持,其他的基本都是自己再搞,还好有csdn这个平台,遇到问题大家能帮忙。
      

  7.   

    你如果想要最好的性能,而且扩展性好,那就
    一台或若干名通讯服务器用来接收所有或分派到客户的数据
    一台或若干名数据服务器放数据库,全部数据或帐套
    一台登记服务器用来存放登录和配置信息总之软件结构上肯定要预先设计好分区,每个客户ID都隶属某个通讯服务器ID和数据库服务器ID,一开始所有客户可以都一样,
    通过不同ID配置不同的IP和数据库连接字符串,强行把客户都分到自己的通讯服务器和数据库服务器上去,客户再多也不怕,无非登记服务器的数据库的表里加一条客户ID,登记服务器的数据库表里还放了个整型字段记载了每个通讯服务器ID和数据库服务器ID
    的负载情况,找到负载最轻的,值最小的,然后+1,然后子表里存好客户ID分别和通讯服务器ID和数据库服务器ID的对应关系,
    值可以有最大值,如果遍历下来都是最大值了,就再加通讯或数据库服务器,以及相应的登记信息
      

  8.   

    楼主自己写个程序做个压力测试不就可以了解服务器负载了吗?另外,既然实时性要求不高,可以不做长连接,客户端连接上发个消息就可以走人.当遇到错误也是连上服务器->发消息->走人.做长连接的话其实很消耗资源的(不用完成端口的情况下),不管你用同步/异步,最后都是由操作系统select一组连接(这组连接就是你程序打开的全部的连接),当其中有一个连接状态改变,处理完成后要重新把所有连接再生成一个数组来select.当连接数非常多的时候,这个构造数组的过程非常影响性能
    Windows下要提高并发数、吞吐量只有用完成端口了,最近我刚好也做了个完成端口的项目,不过是用VC++做的。强烈建议把连接方式由长连接改为短连接。
    就算发心跳包也改成:连接服务器-〉发心跳包-〉断开
    按5分钟发一个包的频率算,服务器承受几十万个客户端都没问题。
      

  9.   

    做个分布式系统的工程就非常庞大,从设计到实现,要考虑的情况太多了,光数据同步就会繁死的,而且在SAN传数据对负载及程序设计也有不小的要求。我觉得如果瓶颈在数据库的话可以考虑做内存数据库,然后用一台备用服务器作数据库的备份。
      

  10.   

    使用C#socket异步通信,我以前也做过一段时候,我发现,数据服务器接收1.6 --- 1.8K的样子,就会挂掉。
    我想,同时连接1000个客户端应该没问题。
      

  11.   

    要看你用什么数据库了,Linux+Oracle绝不让你挂
      

  12.   

    上此提得问题解决了,在此说说,明天来结贴散分。
    一个连接socket断开后,其他连接收不到数据,但是连接还在。
    可能的原因:调用某些重要的函数时,传递参数是引用,可能值被更改,最后把可能的参数进行深拷贝,问题解决。哈哈,上一个贴子应该今天结贴就好了,哈哈,和这个一起结了。
      

  13.   


    02年的传奇私服,PD 3.0GHz 512MB DDR1,带2000个人没问题。
    传奇这类游戏可是TCP长链接。
      

  14.   

    谢谢大家讨论  昨天做了个连接测试 tcp1600多 内存用的比较多 数据库连接比较多 cpu倒是还行??
    现在数据库还没有频繁读写,不知道以后瓶颈会在哪?????
      

  15.   

    我是看了跟帖来分析的.1,根据常规点的通信原则,  N个客户端对应1个服务端,我们建议采取TCP短连接方式. (不怕人笑话你甚至可以直接用HTTP)2,考虑到将来业务,用户的激增 你可以稍微考虑一下扩展性. 比如 XXID的用户只使用XX IP段服务器.或者以其他能达到此功能的设计代替.以上是看帖之后的分析,希望能和你想到一块去.
      

  16.   

    tcp长连接的数目是有限的,以前看过一个文章,最大是65535。超过此数目建议短连接形式或者UDP形式
      

  17.   

    测试软件终端地址ffff  2byte正好65535
      

  18.   

    不对。一般情况下,用一个unsigned short来表示一台电脑的端口。unsigned short是2个字节,即最大表示65536,表示一台电脑最多可以用65536个端口。至于服务器可以接收多少个连接,理论上没有限制。但实践中,往往很难能达到上万个连接的(服务器不但要处理io,也要处理相关的逻辑的)。QQ休闲游戏一台服务器椐说能同时连接20K个连接,那已经很了不起了。
      

  19.   


    lz这种软件不可以选择UDP,况且互联网是一个速度、可靠性都很低的网络,UDP永远代替不了TCP的可靠性。
      

  20.   


    频繁读写会调用外存,外存读写严重时会占用CPU。
    如果有条件的话,读写可以分布在两台服务器上;如果写频繁,读不频繁的话,可以不考虑。
      

  21.   

    要是一直在线也可以啊,可以定义一段时间发一个HeartBeat函数,定时检测啊