• 一月学习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做出来后在放出来,下面列举下学习资源

    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

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

  • 相关阅读:
    node.js学习
    CSS3——3D效果
    解决HTML5布局,兼容IE问题
    Java 反射调用的一种优化
    jQuery中常用正则表达式
    8种NoSql数据库系统对比
    Java的ClassLoader机制
    Maven / Nexus 的用法和经验
    Spring中BeanFactory和ApplicationContext的区别
    Spring Bean的作用域
  • 原文地址:https://www.cnblogs.com/gxh973121/p/2042888.html
Copyright © 2020-2023  润新知