最近在看 websocket 的聊天室功能,有个小疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mengdodo
V2EX    WebSocket

最近在看 websocket 的聊天室功能,有个小疑问

  •  
  •   mengdodo 2019-12-20 10:51:38 +08:00 8094 次点击
    这是一个创建于 2120 天前的主题,其中的信息可能已经有所发展或是发生改变。

    websocket 聊天室中私聊功能,应该就是两个用户的 client_id 之间通信吧。
    那频道群聊功能呢?
    翻了下别人写的 demo,都是 foreach 遍历该频道的所有 client_id 然后逐个推送,感觉好 low,那如果百人群,千人群,万人群,那服务器岂不是炸锅,麻烦大佬指点下。

    //demo 进程启动向所有客户端连接发送数据 foreach ($room_users as $key => $clientId){ if ($currentSessionId != $clientId){ $this->send($clientId, $msg); }else{ $this->send($clientId, $msg_my); } } 
    4 条回复    2020-04-27 18:11:39 +08:00
    firefox12
        1
    firefox12  
       2019-12-20 12:20:04 +08:00
    否则咋整,你要让所有人知道,又不推给所有人,别人怎么知道?写在一个公共队列里,然后让所有人自己来拉?仔细想想这样设计的缺陷在哪里?
    kop1989
        2
    kop1989  
       2019-12-20 12:22:50 +08:00
    微信网页版的实现方式更 low,都不是 websocket,是长轮询。
    每个人的网页无时无刻发送一个异步 http 请求到服务器,超时就再发,然后服务器把这个请求线程 hold 住,如果有信息变化,则请求返回特定 flag。网页收到特定 flag,再去调用业务请求来拉取信息。
    sanggao
        3
    sanggao  
       2019-12-20 13:54:33 +08:00 via iPhone
    @kop1989 长轮训是较好的方式
    binkcn
        4
    binkcn  
       2020-04-27 18:11:39 +08:00
    websocket 的 group 广播消息一般都是这种 foreach 方式。

    实际场景里面一般有这几类情况:
    1 、显示分拆成聊天组,也就是多个 group,这样每个 group 里面的人不会太多,常见于各类聊天工具的“群”模式。

    2 、隐藏式拆分组,比如各种直播平台的弹幕,假定 1w 人同时看一个直播,当有一个人发弹幕的时候,你以为是其他 9999 个人都能收到?不是的…… 实际上这 1w 人会被拆分成 N 个 group,只有那种 vip 用户的加粗弹幕,以及系统广播才是所有人能收到的,这种是先 foreach group,然后继续 foreach clientid 。

    你很难看到哪个聊天软件支持万人级别同时聊天,一来负载太大,二来也没有意义(试想一个上万人的群,那个刷屏速度谁看的过来?)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1156 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 23:29 PVG 07:29 LAX 16:29 JFK 19:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86