为什么很少看到有人用 websocket? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a523

为什么很少看到有人用 websocket?

  •  2
     
  •   a523 2018 年 11 月 12 日 21869 次点击
    这是一个创建于 2722 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前有需求就是前端页面实时显示后端的收集到的最新信息,比如说通知啊,告警啊,

    用的是 ajax 轮询, 后得知有更先进的方法是 websocket, 如是想学下 websocket,可在学习并查找资料的过程中, 发现目前线上用 websocket 的案例真是少之又少啊? 一般都是用的是轮询,比如说阿里巴巴的在线旺旺,QQ 邮箱上传大附件的时候, 等等,Why ?

    不是说,websocket 是 html5 专门用来解决, 服务端向浏览器发送消息的么?是最新的方法么?解决老方法的各种弊端。

    如果你发现有公网上用 websocket 的例子, 请列出来,告诉我。

    第 1 条附言    2018 年 11 月 12 日
    bilibili 貌似也是用的轮询, 没有 ws ,可以按 F12 查看
    第 2 条附言    2018 年 11 月 12 日
    不是说“ HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术”?,
    我很难找到国内知名网站用这个的,所以我想了解下是不是这 websocket 技术本身的原因。还是?
    44 条回复    2020-04-07 09:32:49 +08:00
    agagega
        1
    agagega  
       2018 年 11 月 12 日 via iPhone
    你可以试试 Socket.io ,封装了 WebSocket,如果不支持可以自动 fallback 到轮询
    veightz
        2
    veightz  
       2018年 11 月 12 日
    可能是嫌麻烦。 如果是 http,原有服务自己的负载均衡就能直接 work 了。ws 与固定机器建连,讲道理还有前置搭个连接层, 就觉得先麻烦了。。。 之前内部活动做一个游戏后台,必须 websocket, 赶时间就直接上单机扛了。
    shanliang
        3
    shanliang  
       2018 年 11 月 12 日
    有啊,v2ray 配合 websocket 走 cdn 翻墙,非常普遍了
    Perry
        4
    Perry  
       2018 年 11 月 12 日
    Firebase
    88250
        5
    88250  
       2018 年 11 月 12 日
    * GitHub Issue 评论还有操作等是 WS 实时刷新的
    * 一些社区论坛系统也是 WS 的,回帖会后推送到其他开着同一个帖子的人那里,实时显示,比如黑客派 https://hacpai.com
    TuringGooner
        6
    TuringGooner  
       2018 年 11 月 12 日
    我们公司就用的 socket.io

    一般有实时数据要求的会考虑 websocket 吧
    fe619742721
        7
    fe619742721  
       2018 年 11 月 12 日
    做聊天基本都用啊
    fy
        8
    fy  
       2018 年 11 月 12 日
    穿不透一些国内 cdn,用了之后回归轮询
    NullException
        9
    NullException  
       2018 年 11 月 12 日
    我自己的小站用了下
    https://www.iluwen.com/home
    mewpoi
        10
    mewpoi  
       2018 年 11 月 12 日 via iPhone
    websocket 很多坑,如果只是单页面还好,涉及到多页面,定时推送,复杂的推送,就非常容易出问题了,不管是前端,还是服务端都会遇到很多很多问题
    passerbytiny
        11
    passerbytiny  
       2018 年 11 月 12 日
    因为小业务时可以轮询救急,业务复杂后,又干脆直接找现成的推送框架了。

    只要涉及到长连接的,就肯定要异步编程了,而常规 Web 应用的服务端,是完全的同步编程。从同步编程到异步编程,比从爬到走都难,所以基本都会用现成框架的。
    ragnaroks
        12
    ragnaroks  
       2018 年 11 月 12 日
    应该是 CDN 的问题,不用 CDN 去抗的话直接打死你的 ws 服务器就嗝屁了,
    另外可能还要考虑很多网站还在使用传统开发模式,或者说,能用为什么要换
    ragnaroks
        13
    ragnaroks  
       2018 年 11 月 12 日
    另外 #11 提到一点也是,很多还在使用 web 做后端,我接触过一些已经改用 service(比如用 core.net 写个 consoleApp)
    我自己也有一个项目就是用 C#写个 windows 服务,提供 ws 给网站(纯静态)使用,遇到一个非常麻烦的问题,用户一旦刷新网页就会退出登录状态(虽然这是没问题的),我又不能把 token 存在用户浏览器
    xkeyideal
        14
    xkeyideal  
       2018 年 11 月 12 日   5
    websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 http 降级?

    所以大部分不重要的业务,使用 ws 不如使用 http 轮训来的简单、实在。

    ws 长连接的用户收到消息是个 push 操作,http 轮训用户收消息是 pull 操作,push 都存在单生产推多消费,为广播模型,怎么处理好连接,保障每个消费推且只推一次,很多程序员这个问题不一定能够解决。
    pull 就不一样了,消费方想要你就来生产方拉一下,拉几次,消息就准确的送达几次,不存在多消费和连接处理的问题,缺点当然就是消息推送的不及时,优点非常明显,简单易实现。

    websocket 当然也不是楼主说的没有用,企业内部业务系统之间有时候用 http 协议,又想要消息及时推送,上个 mq 太粗暴,用 grpc 这些支持双向流的 rpc 协议太复杂,此时 ws 就非常好使了。

    本人在公司做过多个 ws 协议的服务端项目,使用体验非常不错,最头疼的当然就是断线重连的问题。
    juneszh
        15
    juneszh  
       2018 年 11 月 12 日
    长连的资源消耗不比轮询低
    a523
        16
    a523  
    OP
       2018 年 11 月 12 日
    @agagega 服务端, 我只会 python 语言用啥? js 会一点但不擅长,Socket.io 是不是得用 node.js 做后端?
    a523
        17
    a523  
    OP
       2018 年 11 月 12 日
    @passerbytiny ”现成的推送框架“ 求推荐
    a523
        18
    a523  
    OP
       2018 年 11 月 12 日
    @TuringGunner web 的后端是 python
    比说说 django flask 能配合 socket. io 服务端使用吗?
    passerbytiny
        19
    passerbytiny  
       2018 年 11 月 12 日
    @a523 #16 我也没有推荐的,因为以前都是轮询救急的。我知道的都是非 Web 方式的的,比如说云推送、环信这些 APP 上用的,还有我自己做的,设备直接用 TCP 长连接的,Netty 自建。
    a523
        20
    a523  
    OP
       2018 年 11 月 12 日
    @agagega 什么情况下会不支持 websocket ? 指老一点的浏览器版本吗?
    ysc3839
        21
    ysc3839  
       2018 年 11 月 12 日 via Android
    如果服务端用的是传统 PHP CGI 模式的话也无法支持 WebSocket。
    你举的例子是因为开发时还没有 WebSocket,到了现在改用 WebSocket 太麻烦。
    hsfzxjy
        22
    hsfzxjy  
       2018 年 11 月 12 日 via Android
    django channels 了解一下
    fxxkgw
        23
    fxxkgw  
       2018 年 11 月 12 日
    网络直播弹幕是不是就是 ws ?
    param
        24
    param  
       2018 年 11 月 12 日
    a523
        25
    a523  
    OP
       2018 年 11 月 12 日
    @hsfzxjy
    @param
    嗯, 这些都了解,疑惑的是像国内( QQ 邮箱上传附件显示进度,阿里旺旺网页版)这些知名网站为什么没用这些技术, 不是说“ HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术”?,
    我也很难找到国内知名网站用这个的,所以我想了解下是不是这 websocket 技术本身的原因。
    watzds
        26
    watzds  
       2018 年 11 月 12 日 via Android
    很多年了,我 14 年用过
    gerrard000
        27
    gerrard000  
       2018 年 11 月 12 日 via iPhone
    阿里网页版的钉钉用的就是 ws
    vanishcode
        28
    vanishcode  
       2018 年 11 月 12 日 via Android
    轮训对于意外中断的处理比 ws 好吧(简单)肯定
    rogwan
        29
    rogwan  
       2018 年 11 月 12 日 via Android   1
    @a523 一些 web 应用不采用 ws 有一个原因是多页面重开,你想想,同时打开几十个淘宝页面就是几十个 ws 连接,这个比较难处理。不像客户端,登录一个可以踢掉另一个,在 web 上这种情况很普遍,轮询处理简单很多。
    bjfane
        30
    bjfane  
    PRO
       2018 年 11 月 12 日
    看什么产品,非固定浏览器,Socket.io 还是可以的。
    feverzsj
        31
    feverzsj  
       2018 年 11 月 12 日
    因为 99%的业务场景只需要无状态的请求回复就可以了
    frankkai
        32
    frankkai  
       2018 年 11 月 12 日 via Android
    mqtt
    dszhblx
        33
    dszhblx  
       2018 年 11 月 12 日 via iPhone
    看你做什么了,H 5 游戏,微信小游戏都是 ws,确切说是 wss
    kslr
        34
    kslr  
       2018 年 11 月 12 日 via Android
    请使用英文关键词
    不过这个东西比轮询复杂多了,量力而行
    anonymous256
        35
    anonymous256  
       2018 年 11 月 12 日 via Android
    我们就是 websocket 的, 用 python 和 golang 各一套实现。负责程序后端和用户界面交互~
    514656282
        36
    514656282  
       2018 年 11 月 13 日 via iPhone
    很少看到有人用 websocket 是怎样得出来的?
    a523
        37
    a523  
    OP
       2018 年 11 月 16 日
    @514656282 按 F12
    a523
        38
    a523  
    OP
       2018 年 11 月 16 日
    @rogwan 好像有道理, 阿里网页版的钉钉是用的 ws, 然后我另开一个页面, 就会提醒我登录, 登录之后, 就会把之前的给踢掉。
    a523
        39
    a523  
    OP
       2018 年 11 月 16 日
    @gerrard000 谢谢提供信息, 我看了一下,网页版钉钉的确是 ws, 但不支持在多个页面登录, 登录第二个页面就把之前的给踢掉了
    xjbeta
        40
    xjbeta  
       2018 年 11 月 23 日
    @fxxkgw
    虎牙 b 站 熊猫 直播弹幕都是用的 websocket
    斗鱼 是 socket
    只有企鹅电竞是 1 秒 1 个网络请求
    xjbeta
        41
    xjbeta  
       2018 年 11 月 23 日
    @xjbeta 斗鱼准确来说 开放 API 文档 接入用的 socket
    本身用的什么不是很清楚
    wyx119911
        42
    wyx119911  
       2019 年 9 月 28 日 via Android   1
    @a523 老邮箱十几年前的产品了,使用的是长轮询技术。新邮箱今年刚上线,需要微信注册,使用 ws 推送技术。
    a523
        43
    a523  
    OP
       2019 年 11 月 21 日
    @wyx119911 QQ 邮箱内部员工? 6666
    chifung408
        44
    chifung408  
       2020 年 4 月 7 日
    最近公司 php+vue 的项目使用了 socket.io,开发的时候时不时出问题,到了要上线部署了才发现不知道什么原因怎么连也连不上.最终都转成使用 WebSocket 才好好连上了.具体到现在还不知道什么原因
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     860 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 135ms UTC 19:55 PVG 03:55 LAX 12:55 JFK 15:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86