估计很快就会被列入标题党了。入正题了,项目说明:一个基于TCP/IP的通讯程序(可以理解为变种QQ),C端负责发送订单(单客户端数据量60条/分,客户端数量预计上万,因为是全国范围),S端接收后,先存,再处理,再分发给其它在线C端。S端异步+线程进行监测连接和数据包到达;
C与S的连接目前是一个端口,考虑到粘包情况,S端独立线程收包,随后独立线程判断包的完整性,再提交给处理线程进行处理(判断完整性和处理用了数据同步),再接着提交给分发线程(负责入库和分发)。
附加说明:数据在内存的存储用了hashtable。每个订单的数据大概是200-300个汉字。程序运行于外网。
问题:就目前这种情况,这种方案有什么可优化的。或是有什么好的方案。望坛友讨论一下。

解决方案 »

  1.   

    单客户端数据量60条/分,客户端数量预计上万
    每秒峰值多少个包呢?
    几台服务器?
    hashtable换成Queue是不是好点呢?
      

  2.   

    峰值有400-500个包单台服务器也在考虑用queue
    有什么好的建议吗?
      

  3.   

    也在考虑用queue之后放弃了,因为包不一定什么时候删除。也不是按顺序来的。
      

  4.   

    我又看了一下我们的框架,大概是这样的:
    用SocketAsyncEventArgs一组线程收包,直接扔到组包缓存队列
    一组线程组包,直接扔到回调缓存队列
    一条线程回调返回给上层最后
    你的客户端数不是很多
    命令包数也不多
    服务器没压力
    数据库会不会是瓶颈呢?
      

  5.   

    SocketUpEx, libinguest,能介绍点相关的资料吗?我一个项目也是和libinguest的类似,还不知道如何着手呢。
      

  6.   

    是否需要每秒处理10000条数据?单机不太适合做这事。
    如果需要删改,单机数据库肯定受不了。
    就算只增加数据,也只能批量写入,单机硬盘受不了每秒几万次的读写。那么处理数据网络流量接近10M/s,这个没问题,但是下面的问题大了。其他在线C端如果预计上万,那么网络流量10000*10M/s=100G/s。
    需要确认这数据一定要分发吗?还是让C端自己根据需要来取数据?
    如果一定要分发,就需要使用P2P技术,让在线C端相互发数据。
      

  7.   


    漏看这个功能了:
    数据是必须即时转发还是可以适当延时?
    每次都要转发所有在线用户还是只转给该用户的好友?
    如果我来做
    我可能不会使用服务端转发,也不会使用P2P
    服务端转发会让服务端更加繁忙
    P2P会增加开发的难度,而且P2P环境各异,P2P失败率不低啊
    我的做法:
    各客户端增加一个心跳命令,心跳时隔可以适当延长
    如果需要更新数据,就在心跳包里返回给客户端
    客户端主动去服务端更新数据
    这样做还有一个好处,可以在服务端控制同时更新的客户端数据
    例如,每次只能100个客户端同时更新
    处理完这100个客户端,才进行下一轮
      

  8.   


    数据库有瓶颈目前不是问题。因为这个数据量如你所说, 不太大,主要体现在C与S的实时通讯。交互方面。S端是统一操作数据库,只会延时,或是批量入库。
      

  9.   


    请教一个问题:
    1. “如果需要更新数据,就在心跳包里返回给客户端
        客户端主动去服务端更新数据”。意思是返回给客户端的心跳包里含有“是否更新”命令,客户端接收到含有“更新”的命令返回值后,主动发送请求更新客户端的数据到服务器?2. 客户端采用你之前说的“用SocketAsyncEventArgs一组线程收包,直接扔到组包缓存队列
    一组线程组包,直接扔到回调缓存队列
    一条线程回调返回给上层
    ”方式更新到服务器上?
      

  10.   

    我对这个话题很感兴趣,libinguest,SocketUpEx望指点!
      

  11.   


    意思是返回给客户端的心跳包里含有“是否更新”命令,客户端接收到含有“更新”的命令返回值后,主动发送请求更新客户端的数据到服务器?至于交互的协议你可以自己定。
    不过后面你理解反了,是C与S有心跳机制,S是被动下发,C是主要去要。当然上面还有人提到,可以采用分批处理客户端的主要申请
      

  12.   

    libinguest,你的框架最后确定没?