一月学习socket tcp通信总结
学习过程
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做出来后在放出来,下面列举下学习资源
html">http://www.zzzyk.com/kf/201105/90403.html
蛙蛙教你解析网络包
网络上针对具体问题的还很多,就不列了
补充:综合编程 , 其他综合 ,