a523
V2EX  ›  问与答

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

  •  2
     
  •   a523 · Nov 12, 2018 · 21922 views
    This topic created in 2740 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

    本人在公司做过多个 ws 协议的服务端项目,使用体验非常不错,最头疼的当然就是断线重连的问题。
    juneszh
        15
    juneszh  
       Nov 12, 2018
    长连的资源消耗不比轮询低
    a523
        16
    a523  
    OP
       Nov 12, 2018
    @agagega 服务端, 我只会 python 语言用啥? js 会一点但不擅长,Socket.io 是不是得用 node.js 做后端?
    a523
        17
    a523  
    OP
       Nov 12, 2018
    @passerbytiny ”现成的推送框架“ 求推荐
    a523
        18
    a523  
    OP
       Nov 12, 2018
    @TuringGunner web 的后端是 python
    比说说 django flask 能配合 socket. io 服务端使用吗?
    passerbytiny
        19
    passerbytiny  
       Nov 12, 2018
    @a523 #16 我也没有推荐的,因为以前都是轮询救急的。我知道的都是非 Web 方式的的,比如说云推送、环信这些 APP 上用的,还有我自己做的,设备直接用 TCP 长连接的,Netty 自建。
    a523
        20
    a523  
    OP
       Nov 12, 2018
    @agagega 什么情况下会不支持 websocket ? 指老一点的浏览器版本吗?
    ysc3839
        21
    ysc3839  
       Nov 12, 2018 via Android
    如果服务端用的是传统 PHP CGI 模式的话也无法支持 WebSocket。
    你举的例子是因为开发时还没有 WebSocket,到了现在改用 WebSocket 太麻烦。
    hsfzxjy
        22
    hsfzxjy  
       Nov 12, 2018 via Android
    django channels 了解一下
    fxxkgw
        23
    fxxkgw  
       Nov 12, 2018
    网络直播弹幕是不是就是 ws ?
    param
        24
    param  
       Nov 12, 2018
    a523
        25
    a523  
    OP
       Nov 12, 2018
    @hsfzxjy
    @param
    嗯, 这些都了解,疑惑的是像国内( QQ 邮箱上传附件显示进度,阿里旺旺网页版)这些知名网站为什么没用这些技术, 不是说“ HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术”?,
    我也很难找到国内知名网站用这个的,所以我想了解下是不是这 websocket 技术本身的原因。
    watzds
        26
    watzds  
       Nov 12, 2018 via Android
    很多年了,我 14 年用过
    gerrard000
        27
    gerrard000  
       Nov 12, 2018 via iPhone
    阿里网页版的钉钉用的就是 ws
    vanishcode
        28
    vanishcode  
       Nov 12, 2018 via Android
    轮训对于意外中断的处理比 ws 好吧(简单)肯定
    rogwan
        29
    rogwan  
       Nov 12, 2018 via Android   ❤️ 1
    @a523 一些 web 应用不采用 ws 有一个原因是多页面重开,你想想,同时打开几十个淘宝页面就是几十个 ws 连接,这个比较难处理。不像客户端,登录一个可以踢掉另一个,在 web 上这种情况很普遍,轮询处理简单很多。
    bjfane
        30
    bjfane  
    PRO
       Nov 12, 2018
    看什么产品,非固定浏览器,Socket.io 还是可以的。
    feverzsj
        31
    feverzsj  
       Nov 12, 2018
    因为 99%的业务场景只需要无状态的请求回复就可以了
    frankkai
        32
    frankkai  
       Nov 12, 2018 via Android
    mqtt
    dszhblx
        33
    dszhblx  
       Nov 12, 2018 via iPhone
    看你做什么了,H 5 游戏,微信小游戏都是 ws,确切说是 wss
    kslr
        34
    kslr  
       Nov 12, 2018 via Android
    请使用英文关键词
    不过这个东西比轮询复杂多了,量力而行
    anonymous256
        35
    anonymous256  
       Nov 12, 2018 via Android
    我们就是 websocket 的, 用 python 和 golang 各一套实现。负责程序后端和用户界面交互~
    514656282
        36
    514656282  
       Nov 13, 2018 via iPhone
    很少看到有人用 websocket 是怎样得出来的?
    a523
        37
    a523  
    OP
       Nov 16, 2018
    @514656282 按 F12
    a523
        38
    a523  
    OP
       Nov 16, 2018
    @rogwan 好像有道理, 阿里网页版的钉钉是用的 ws, 然后我另开一个页面, 就会提醒我登录, 登录之后, 就会把之前的给踢掉。
    a523
        39
    a523  
    OP
       Nov 16, 2018
    @gerrard000 谢谢提供信息, 我看了一下,网页版钉钉的确是 ws, 但不支持在多个页面登录, 登录第二个页面就把之前的给踢掉了
    xjbeta
        40
    xjbeta  
       Nov 23, 2018
    @fxxkgw
    虎牙 b 站 熊猫 直播弹幕都是用的 websocket
    斗鱼 是 socket
    只有企鹅电竞是 1 秒 1 个网络请求
    xjbeta
        41
    xjbeta  
       Nov 23, 2018
    @xjbeta 斗鱼准确来说 开放 API 文档 接入用的 socket
    本身用的什么不是很清楚
    wyx119911
        42
    wyx119911  
       Sep 28, 2019 via Android   ❤️ 1
    @a523 老邮箱十几年前的产品了,使用的是长轮询技术。新邮箱今年刚上线,需要微信注册,使用 ws 推送技术。
    a523
        43
    a523  
    OP
       Nov 21, 2019
    @wyx119911 QQ 邮箱内部员工? 6666
    chifung408
        44
    chifung408  
       Apr 7, 2020
    最近公司 php+vue 的项目使用了 socket.io,开发的时候时不时出问题,到了要上线部署了才发现不知道什么原因怎么连也连不上.最终都转成使用 WebSocket 才好好连上了.具体到现在还不知道什么原因
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5891 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 03:18 · PVG 11:18 · LAX 20:18 · JFK 23:18
    ♥ Do have faith in what you're doing.