gy134340
V2EX  ›  问与答

所以 Websocket 的本质是把前端的轮询放到后端了?

  •  
  •   gy134340 · Mar 27, 2017 · 9319 views
    This topic created in 3358 days ago, the information mentioned may be changed or developed.

    本来比较传统的实时查询数据库更新是在前端 ajax 来轮询,现在看了一下 socket.io 的实现 websocket 如果来做数据库变动监测还是要写 setTimeInterval() 之类的,所以 websocket 出来的意义就是为了节省每次重发 http 请求的带宽吗? 求大神指导如何实现 实时监测数据库字段的更新并发送给前端,难道真的要换 PostgreSQL 这样支持 listen/notify 的数据库?

    33 replies    2017-03-28 22:38:56 +08:00
    billlee
        1
    billlee  
       Mar 27, 2017
    谁说后端一定要轮询数据库?
    UnisandK
        2
    UnisandK  
       Mar 27, 2017   ❤️ 1
    Transfer-Encoding: chunked
    gy134340
        3
    gy134340  
    OP
       Mar 27, 2017
    @billlee 说话说一半,老哥,说完啊
    HongJay
        4
    HongJay  
       Mar 27, 2017
    好像是节省带宽|
    denghongcai
        5
    denghongcai  
       Mar 28, 2017
    写库时触发更新事件或者简单点换数据库

    如果用轮询的做法确实是没什么区别
    barbery
        6
    barbery  
       Mar 28, 2017
    没搞懂, websocket 的优势是 push ,数据库发生了变动就应该主动 push ,而不是还是被动的查询数据检查是否有变动
    changwei
        7
    changwei  
       Mar 28, 2017 via Android
    如果只是单纯的让页面数据模型和后端数据库的数据模型同步,那么可以用各种框架提供的事件方式来触发 websocket 的推送,并不用轮循。
    mkdong
        8
    mkdong  
       Mar 28, 2017 via iPhone
    @gy134340 后端不一定要轮询啊,比如前端发 1+1 给后端,后端计算之后发给前端 2 。 socket 嘛,双向都可以发东西给对方的。
    xylitolLin
        9
    xylitolLin  
       Mar 28, 2017 via iPhone
    不知道是不是这个本质,但是哪怕是,我觉得也是值得。前端的体验和 Http 请求关系太大了,能省则省
    gy134340
        10
    gy134340  
    OP
       Mar 28, 2017
    @barbery 那如果是单独的两个应用,一个 insert 数据,另一个对数据库有读的权限,数据库发生变动怎样自己 push, 触发器吗,注意是两个单独分开的应用,对着同一个数据库
    FrankFang128
        11
    FrankFang128  
       Mar 28, 2017
    节省 HTTP 请求这还不够吗
    cevincheung
        12
    cevincheung  
       Mar 28, 2017
    @gy134340 #10

    browser <-> websocket <-> socket-server

    ( QueueProducer ) -> QueueManager -> ( QueueConsumer -> socket -> socket-server )
    cevincheung
        13
    cevincheung  
       Mar 28, 2017
    @gy134340 #10

    修改了用户名,触发修改事件(应用级代码逻辑层),入队列

    队列消费者 -> 通知 socket-server-gateway -> 用户 ID 为 X 修改了用户名

    socket-server-gateway -> 这个用户在哪个 socket-server 上?登录了没?没?放弃,不处理。在线?推送消息给他。

    socket-server -> 用户 ID 为 X 的在我这,知道了,正在推。

    browser -> 嗯,我知道了。 JS ,该你了。
    gy134340
        14
    gy134340  
    OP
       Mar 28, 2017
    @mkdong 只是在做监测数据表变动时需要轮询数据表
    jybox
        15
    jybox  
       Mar 28, 2017
    socket.io 并不仅仅是 web socket ;轮询模型中额外开销是很大,即使连接可以复用,也依然要解析请求头,生成响应头;至于后端内部怎么通知是另一回事了,一般是 redis 的 pub/sub 。
    SoloCompany
        16
    SoloCompany  
       Mar 28, 2017
    有你这样把架构和实现混在一起说的吗?
    那是不是现在满大街的 ARM 的模拟器就可以说 ARM 本质上就是把指令解释放到 x86 上执行了?
    msg7086
        17
    msg7086  
       Mar 28, 2017
    后端用消息队列来主动触发啊,为啥要轮询数据库?谁改了数据谁发声啊。
    wwqgtxx
        18
    wwqgtxx  
       Mar 28, 2017 via iPhone
    那么多消息队列都被你无视了,另外像实时弹幕直播这种活动完全不需要跑数据库嘛,服务端收到了之后直接处理一下全局广播就好了嘛
    rashawn
        19
    rashawn  
       Mar 28, 2017 via iPhone
    websocket 跟轮询没啥关系吧
    helloworld12
        20
    helloworld12  
       Mar 28, 2017
    socketio 才是轮询
    websocket 是 tcp 长连接
    misaka19000
        21
    misaka19000  
       Mar 28, 2017 via Android
    楼主你需要读一下《 Unix 网络编程》
    gy134340
        22
    gy134340  
    OP
       Mar 28, 2017 via Android
    @wwqgtxx OK ,假设是两个单独的应用,一个去录入数据到数据库,另一个只有对数据库读这样,两个后端的代码分开的
    huijiewei
        23
    huijiewei  
       Mar 28, 2017 via iPhone
    @gy134340 分开又怎样,已经跟你说了用消息队列了
    morethansean
        24
    morethansean  
       Mar 28, 2017
    @gy134340 没有消息队列吗?很常见的情况啊。
    wwqgtxx
        25
    wwqgtxx  
       Mar 28, 2017 via iPhone
    @helloworld12 socket.io 同时支持长轮询, xhr 轮询, websocket 底层

    @gy134340 消息队列呀,大家说了那么多遍,你都视而不见是吧,不要把目光局限在数据库中嘛
    panlilu
        26
    panlilu  
       Mar 28, 2017
    不用消息队列的话,试试 rethinkdb?
    gy134340
        27
    gy134340  
    OP
       Mar 28, 2017
    ok, 谢谢诸位老哥
    z4none
        28
    z4none  
       Mar 28, 2017 via Android
    对于你这个场景,就好比自己轮询拿快递和送快递上门的区别。试想多个前端轮询是什么情况。
    WispZhan
        29
    WispZhan  
       Mar 28, 2017
    Websocket 难道不是目的是让服务器推送更容易吗?话说为什么要轮询……
    服务端可以根据数据变更的 Event 来主动向客户端发起 Push ,要么直接 push 变更数据,要么 push 一个更新请求然后让客户端自己查询。
    qiayue
        30
    qiayue  
    PRO
       Mar 28, 2017
    @gy134340 让录入数据的提供消息
    Finest
        31
    Finest  
       Mar 28, 2017
    简单使用 redis 的 pub/sub 就不用轮询了
    aleen42
        32
    aleen42  
       Mar 28, 2017
    其实还是挺有用的,且不说实时监测数据库更新,我之前做的监听二维码扫描的简单需求,若用轮询可以发现服务器所需要处理的请求会非常之多,更何况当时是用的 PHP 做后端,压力可想而知。 web socket 长链接的方案就是为了解决诸如此类问题,因此不要轻视 HTTP 请求量的减少,这意义匪浅。
    gy134340
        33
    gy134340  
    OP
       Mar 28, 2017 via Android
    @aleen42 本狗也是做这个,检测扫描二维码
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2904 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 05:10 · PVG 13:10 · LAX 22:10 · JFK 01:10
    ♥ Do have faith in what you're doing.