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

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

  •  
  •   gy134340 · 2017-03-27 23:24:16 +08:00 · 8116 次点击
    这是一个创建于 2579 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    browser <-> websocket <-> socket-server

    ( QueueProducer ) -> QueueManager -> ( QueueConsumer -> socket -> socket-server )
    cevincheung
        13
    cevincheung  
       2017-03-28 00:28:40 +08:00
    @gy134340 #10

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

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

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

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

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

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