V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
a523
V2EX  ›  问与答

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

  •  2
     
  •   a523 · 2018-11-12 11:51:27 +08:00 · 20827 次点击
    这是一个创建于 2240 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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