gxh973121

博客园 首页 新随笔 联系 订阅 管理
学习过程中参考了不少园里的文章,表示感谢先

 

学习过程
1.首先学习封包拆包,这步是必须的
2.考虑怎样实现高并发的通信,在网上浏览很多文章,这里我选用了SocketAsyncEventArgs,这个类在.net2.0sp1及以后版本
  支持,此类对异步socket收发,线程调度,信号同步等做了封装优化,底层直接调用winapi,所以  socket通信效率是跟语言无关的
3.进行封装成一个公共类库,方便以后调用

总结:
socket 的并发连接是很高的,一般几万个不成问题,当然我说的只是连接,我只拿1w个并发连接进行了
测试,再高意义也不大,因为下一步的业务处理逻辑等会对他进行限制,形成瓶颈
下面通过测试来说明问题

测试方案一
客户端并发4000个连接到服务器,每过30秒发送一条消息到服务器(内容就是一日期),服务器收到
拆包保存到mysql数据库,然后把消息再发回客户端,上图开始

 

 服务器客户端连接完毕

 

 

经过5轮首发消息,得到结论负载完全正常

 

测试2

看上面结果处理还蛮轻松的,我们继续给它加压 并发10000个连接

 

 

 上面的结果大家看到了,客户端已经发送了30000条,但服务器只处理了5579条,其余的哪去了,没有丢,其实socket收发速度是很快的

立刻处理不了的被缓存了,当缓存达到一定数量时,就要出处理方案了,这时候要么拒绝服务,大家常见的Http500 服务器忙 错误怎么来的知道了吧,

要么扩容,多台服务器分担压力

 回到正题来,我们在服务器端没什么业务逻辑呀,就只解了下包,不应该连这点并发都处理不了啊,开始排查瓶颈,用profiler工具查看,发现80%左右耗在了

写mysql数据库上, 解决方法就是把这些io干掉

1.批更新,等到1000条再batch update 到数据库里,对我我这个测试或小应用足够了

2.换到内存数据库上(目前对内存数据库我了解不多,内存数据库要防断电等,所以最终要同步到磁盘sql数据库中),内存数据作为中间缓冲层,通过同步策略到磁盘上

 

 

结束语:瓶颈找到了,问题也就解决了,以后想在此基础上写个IM

 -------------------------------------------------------------------------

我代码就不贴也,等im做出来后在放出来,下面列举下学习资源

http://www.cnblogs.com/onlytiancai/archive/2008/07/26/unpack_network_package.html
蛙蛙教你解析网络包

http://www.cnblogs.com/Alexander-Lee/archive/2009/11/11/1601021.html

发一个异步TCP开发库,求批评,求指正,求BUG

 

网络上针对具体问题的还很多,就不列了

 

posted on 2011-05-11 10:07  gxh973121  阅读(2852)  评论(13编辑  收藏  举报