zoukankan      html  css  js  c++  java
  • 何以解我那心中对长连接的惧?

          与高人沟通,是最好的成长,解我那心中对长连接的惧!

           一直以来,我对长连接都是怀着深深地恐惧。因为在我的印象中,如果每个用户都保持长连接,那么,假设有稀稀松松有几个用户来到你的服务面前,那么你的并发瞬间就飚高了,那么你的服务能力一下就下去了。所以,我害怕,害怕啥事没干,服务就被干垮了!

          长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接;后者是每次请求,都新建一个Socket,处理完一个请求就直接关闭掉Socket。所以,其实区分长短连接就是:整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的。

           长连接的好处:最大的好处就是让服务器知道客户端在哪里(个人感觉),可以随时向客户端发送消息。最大二好处是,省去了每次建立连接时的性能破费,c/s互发消息,直接复用原来建立的连接即可,无需再进行三次握手啥的。坏处自然也明显,也就是我一直以来担心的,能力下降得厉害,(当然还得看业务场景)。因为我做的业务都是,请求应答型的业务,所以,针对这种场景,并发数取决于实时请求的人数。此时,如果使用长连接,就会导致很多无用的客户端也被当作了并发的来源了,所以服务能力一下子就下来了。最终的结果就是,没几个业务就把自己干死了,所以我是真虚啊。

           短连接就比较方便了,需要我就请求,不需要就关闭,用完就走。缺点就是,每次请求时,需要耗费力气去重新建立连接,然后才能与服务端通信。所以,短连接的单个操作性能是很差的。(遇到连续n个请求发出时,负担就比较可观了,当然还是有其他解决办法的,如设置较短的超时关闭时间)

          那么,回到我的担心:如果都用长连接,后备服务器得准备多少啊?比如,我有100w的uv。往最坏了打算,有多少uv就保持多少连接,咱们来算算。为了保持100w的连接,咱们单机自然是做不了,所以就要测算单机的最大连接数能保持多少,假设单机服务能力为最大保持2000连接(这个值不大,也不小),那么,为了保持100w的能力,咱们就必须至少要有500台服务器存在,这是在完全没有任何灾备,满打满算得到的,否则的话就得更多了。服务器台数嘛说多也不多,还行吧,咱们先说到这里。

          咱们再来假设一个不合宜的场景,咱们100w的uv,买了那么多的服务器,假设咱们的pv是200w,也就是每个客户端就访问了2次服务端。200w/24h/3600s=2.314814814814815。即咱们的平均并发数为2.32,看到了吧,这是什么概念,我们同时就2-3个人访问了有用的东西,为此我们却付出了惨重的代价。当然,这也是我以前的算盘,这导致了我对长连接的恐惧。

           然而,算盘是不该这么打的。如果真这么干的话,老板绝对第一个把你干掉。当然,你还有有个挽回的办法,就是去把你的用户都激活了,求求你们,一直操作吧,这样我们的服务器就不会浪费了。嘿嘿,想得美。

           所谓的长连接,其实也只是相对的,即你有活动时,保持真正的长连接,如果很长时间你都没有真实操作了,那么,仍然把你的连接给你断掉,这样压力不就下来了嘛。再回头看一下刚才那个场景,每个ip就访问了2次有效数据,那么过一会我就把你连接给你断掉,到最后,都把连接关完了,咱们又满血复活了,100w的能力回来了。

          我靠,不会吧,这么牛逼的招数,你想过后果没?后续你服务端怎么给客户端发消息?是的,这是个难题。但是,解决方案总是有的。那就是找个替代者嘛你的连接断开了,就另外去找一个保持了连接的点嘛,让他来代替你找到客户端,把消息发过去就ok了。看起来很完美!那么问题来了,怎么样去找到这样的一个点呢?这个,确实有点难,各个设备的找寻方式是不一样的,比如苹果手机,那么这个点就是苹果的总服务器,如果是华为手机,那么就变成了华为的总服务器了,而pc呢,这个我也不知道了,求你告诉我,哈哈!当客户端收到这个消息后,再次主动建立一个通道连接,然后又开始愉快的沟通生活了,如此反复。

          那么,通过以上方式,咱们就解决了长连接带来的问题,是不是很happy啊。

          在业务量很大的时候,其实咱们就不应该考虑成本问题了,比如你想做及时通讯,却又不愿付长连接一字带来的成本,那就麻烦了(当然了,有厂商愿意给你做,只要你有钱)。再比如你的业务量很大,但是你却不愿意付出很多的存储服务器来存放用户的各种行为数据,或者其他流水数据,老是想着怎样省这一毛两毛的存储费用。这活咱就别干了,越到后面,数据就越是宝贵的资源,所以,有用的数据你就存吧,别整那些没用的。宽带不够,咱们用户量够大,咱们就加吧,这种好事咱别求!

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/yougewe/p/9308464.html
Copyright © 2011-2022 走看看