a523
V2EX  ›  问与答

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

  •  2
     
  •   a523 · Nov 12, 2018 · 22507 views
    This topic created in 2919 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
    agagega
    Nov 12, 2018 via iPhone
    1
    你可以试试 Socket.io ,封装了 WebSocket,如果不支持可以自动 fallback 到轮询
    veightz
    veightz
    Nov 12, 2018
    2
    可能是嫌麻烦。 如果是 http,原有服务自己的负载均衡就能直接 work 了。ws 与固定机器建连,讲道理还有前置搭个连接层, 就觉得先麻烦了。。。 之前内部活动做一个游戏后台,必须 websocket, 赶时间就直接上单机扛了。
    shanliang
    shanliang
    Nov 12, 2018
    3
    有啊,v2ray 配合 websocket 走 cdn 翻墙,非常普遍了
    Perry
    Perry
    Nov 12, 2018
    4
    Firebase
    88250
    88250
    Nov 12, 2018
    5
    * GitHub Issue 评论还有操作等是 WS 实时刷新的
    * 一些社区论坛系统也是 WS 的,回帖会后推送到其他开着同一个帖子的人那里,实时显示,比如黑客派 https://hacpai.com
    TuringGooner
    TuringGooner
    Nov 12, 2018
    6
    我们公司就用的 socket.io

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

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

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

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

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

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