V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
miniyao
V2EX  ›  JavaScript

使用 websocket 或者 sse 实时更新页面上的展示,长连接会阻塞 http 请求,是不是要分开用一个子域名专门做长连接?

  •  
  •   miniyao · 2021-02-13 16:31:24 +08:00 · 3071 次点击
    这是一个创建于 1363 天前的主题,其中的信息可能已经有所发展或是发生改变。
    页面上要展示实时数据,用轮询达不到时效性要求,改用 websocket 或者 sse 方式长连接,这样服务端就被 socket 的长连接监听阻塞了,正常 http 请求就不能返回,而且前端的负载均衡,和 http 混在一起也不好搞。

    这种 http 服务中,加入 websocket 是不是一般都单独用一个子域名,起单独的服务处理长链接问题?
    15 条回复    2021-02-17 01:04:23 +08:00
    7gugu
        1
    7gugu  
       2021-02-13 16:45:55 +08:00
    你放到别的端口不就好了嘛?不阻塞 80 和 443 就好了啊。
    ferock
        2
    ferock  
       2021-02-13 17:25:17 +08:00 via iPhone
    你后端怎么实现的?不会是 fpm 吧
    miniyao
        3
    miniyao  
    OP
       2021-02-13 17:31:02 +08:00
    @7gugu 新开个端口,和开个子域名没区别呀

    @ferock 后端开始是线程池和消息队列的方式,后来发现前端负载均衡不好搞。不行的化,就用个子域名,配置一下跨域估计能行。
    ferock
        4
    ferock  
       2021-02-13 17:48:55 +08:00 via iPhone
    @miniyao #3

    不说实现方式怎么讨论?
    telami
        5
    telami  
       2021-02-13 19:51:07 +08:00
    #新开个端口,和开个子域名没区别呀

    怎么会没区别呢
    larry801
        6
    larry801  
       2021-02-13 19:51:22 +08:00
    我这 node 的服务器没事 http 和 websocket 共存 不过没有 LB 量也不大
    sujin190
        7
    sujin190  
       2021-02-13 20:13:29 +08:00 via Android   ❤️ 1
    其实如果只是简单使用还是轮询比较好弄,服务器别立刻返回,有数据再返回,否则一分钟超时一次,配合协程啥的很快就搞定了,还心跳啥啥的网络问题都不用管,又简单又稳定,等其他给数据也好实现,队列、redis 的 subpub 或者啥分布式锁什么的都可以,几分钟就搞出来了
    sujin190
        8
    sujin190  
       2021-02-13 20:14:34 +08:00 via Android
    时效性也妥妥的毫无问题
    cowcomic
        9
    cowcomic  
       2021-02-13 20:17:18 +08:00   ❤️ 1
    有多少并发啊,一台 linux 服务器能提供 6 万多个 socket 连接,剩下的就是每个连接消耗的内存。如果 ws 长连接的并发已经到了万这个量级,那最好是用一个新域名专门处理
    YouLMAO
        10
    YouLMAO  
       2021-02-13 20:43:11 +08:00 via Android
    同一个域名,不同路径,nginx 映射到不同 upstream, ws 的 header 要 upgrade 的
    lihongming
        11
    lihongming  
       2021-02-15 01:46:13 +08:00 via iPhone
    弄个服务专门保持连接,只负责转发消息不处理,自己内部用 mq 之类的东西与负责处理消息的服务交换数据,彻底解偶
    nobird
        12
    nobird  
       2021-02-16 14:26:57 +08:00
    阻塞 80/433 也没问题,你的服务器端不要直接用 webserver 监听 80/433 就行了,单独再写一个转发工具,判断是 http 就给 80/433,如果是 websocket,就转给你的 websocker server....
    lewinlan
        13
    lewinlan  
       2021-02-16 15:14:02 +08:00 via Android
    js 不都是协程吗?奇怪了你这用的什么框架?难道自己处理 socket ?
    abersheeran
        14
    abersheeran  
       2021-02-16 16:15:11 +08:00
    我看标题以为是浏览器对单一域名的最大连接数限制了你,结果点进来一看是服务端限制。咋说呢,你不懂计网,就别为难自己了,HTTP 挺好的,那么多成熟方案你随便抄一个就行了。

    @cowcomic 还有这位五更琉璃的老公,服务端程序进行 accept 不受 65535 最大端口数的限制。所以也不存在什么六万多的连接限制。
    cowcomic
        15
    cowcomic  
       2021-02-17 01:04:23 +08:00
    @abersheeran 是的,这块我记错了,服务端没有端口数量限制,只取决于 CPU 内存资源
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.