有一个关于即时聊天的疑惑

@Ta 2023-06-14发布,2023-06-16修改 26011点击

像QQ这种 ,登录后随时都可以接收所有自己加入的房间(群组)的消息,那是不是意味着每当连接打开,就需要订阅所有我所在房间的消息。是不是对服务器要求会非常高。如果不是这样,是有其他办法吗?

谢谢大家的回复,但是涉及的内容我插不上话,只能边看边学

https://www.chengyao.xyz

回复列表(19|隐藏机器人聊天)
  • @Ta / 2023-06-15 / /
    被锁定
    楼主 @加勒比海带 于 2023-06-15 20:01 删除了该楼层,理由如下:

    无关评论

  • @Ta / 2023-06-15 / /

    @加勒比海带,是,所以QQ群有人数上限,就是为了避免单个群连接数太高服务器撑不住,以及形成广播风暴(每发一个消息就要转发给几千人这种)。限制为几百人是比较合适的。

    至于具体的实现,可以采用消息中继模型:

    1. 我只与负责我登录的服务器联系。群里的其他人各自在他们的服务器,和我可以不在同一个服务器。
    2. 每个群都有一个专门负责的服务器进行中继。
    3. 有人发消息时,先发给自己的服务器,然后自己的服务器把消息转发给对应群的中继服务器,中继再查找各个群成员在哪个服务器,并逐一转发。最后群里的所有人都收到了消息。
    4. 此时设置群成员上限就很有必要,否则每次发消息都相当于给所有服务器都发了一遍,形成广播风暴。
  • @Ta / 2023-06-15 / /

    @老虎会游泳,那直播弹幕那种呢?几十成百上千万用户直播间那种。。

  • @Ta / 2023-06-15 / /

    yy几万人在一个频道即时聊天 当年可是行业翘楚

  • @Ta / 2023-06-15 / /

    @无名啊,因为每个直播都是一个单独的连接,不需要考虑多个群共享连接,所以采用CDN模型就行了,由一个中心服务器负责发送消息,然后逐级分发给全国CDN,每个人收到的消息都一样。发弹幕则是统一发给那个中心服务器。

  • @Ta / 2023-06-15 / /

    @老虎会游泳,不是发一个弹幕,就要转发给其他 几十成百上千用户 咩。。

  • @Ta / 2023-06-15 / /

    @无名啊,直播弹幕和群聊的不同点:

    1. 历史记录:如果对方发消息时你不在线,群聊允许你稍后接收消息,但直播就直接错过了。
    2. 连接数量:为每个直播间建立一个TCP连接是可接受的,但为每个群建立一个TCP连接似乎不可接受(你可能加入了几百个群)。所以群聊必须由服务器合并你收到的消息,但直播间不需要合并。
    3. 消息可达性:未收到某个群消息是不可接受的,但未收到某些弹幕完全可以。很多人气很高的直播间弹幕一屏根本放不下,都是裁剪后显示的,每个人都只收到了部分弹幕。
  • @Ta / 2023-06-15 / /

    @无名啊,直播间弹幕甚至可以像直播本身一样通过无状态HTTP服务器分发,按时间切片放在不同的json文件里,然后由一个列表(类似m3u8)不断列出最新的json文件名,由播放器自行下载展示。这样就能用分发直播视频流的渠道分发弹幕了。

  • @Ta / 2023-06-15 / /

    QQ客户端和服务器之间有心跳机制,客户端通过周期性心跳上报,可知道什么时候需要拉消息或服务器知道什么时候推消息
    ~~~

  • @Ta / 2023-06-15 / /

    @老虎会游泳,群聊风暴的问题,我是使用了group_id赋予群的内部编号,这样系统逻辑需要推送的时候,只要解析这个id就知道具体的分布式中的目标gateway的ip:port,这样就不会造成群惊了,
    IMG_9891.jpeg(45.95 KB)IMG_9892.png(164.18 KB)

  • @Ta / 2023-06-15 / /

    @加勒比海带,我与老虎讨论,老虎给我出了一个接近90%完美方案,还有10%是因为没有经过大规模实践不确定因素。

    大致就是: 微信私我,给你发我总结的原理截图

  • @Ta / 2023-06-15 / /

    顺便一提直播弹幕,我觉得最有趣的方法是直接把弹幕嵌在视频流的字幕轨里,这样只要前端加个字幕轨提取代码就行了。视频编码器那边,加字幕的工作交给切片服务器就行了,切片是很简单的工作,顺便混合一下字幕不会有什么额外开销。唯一的问题是审核,想删掉嵌入视频的弹幕比较困难

  • @Ta / 2023-06-15 / /

    @老虎会游泳,那个收弹幕的中心服务器,性能一定很强吧,要接收全国这么多用户的弹幕。。

    说来也是,直播的数据量比聊天、弹幕大多了,基本也都全送达了

    直播弹幕嵌在视频里,这想法挺新奇啊。
    就是设置 全屏/半屏/四分之一屏弹幕、弹幕关键字屏蔽 等功能会不会不方便了。。

  • @Ta / 2023-06-16 / /

    @无名啊,可以负载均衡啊,一个直播间对应一个弹幕服务器就行了。

    减少弹幕数量和屏蔽的功能都可以在前端实现,字幕轨只是用于提取弹幕内容。

  • @Ta / 2023-06-16 / /

    @老虎会游泳,让我理理:

    • QQ群聊:用户发消息 -> 最近服务器 -> 群所属中继服务器 -> 其他所有成员所在服务器 -> 其他成员接收
    • 直播弹幕:用户发弹幕 -> 最近服务器(可能随机丢弃) -> 直播间所属弹幕服务器(只需处理一次,可裁剪弹幕) -> CDN -> 观众

    所以,QQ群聊的每一条消息,服务器都要针对每个成员单独处理,无法重用。

    如果一个人平均会加入 X 个群,平均每个群有 Y 个成员,平均每人每天发 Z 条消息,则一天消耗 用户数XY*Z 次服务器资源。

    要节省服务器开支,则 X、Y、Z 都要限制?

    而直播弹幕,对于某一个直播间,服务器可收集用户发送的全部/部分弹幕,并裁剪成如每秒最多 1000 条弹幕,再分发?

    即,可针对所有观众统一处理弹幕,重用性贼高?

  • @Ta / 2023-06-16 / /

    @胡椒舰长,真的么?要么直接贴出来呗。大家都学学
    https://www.chengyao.xyz

  • @Ta / 2023-06-16 / /

    @加勒比海带,,苹果手机不支持长截图,我可以直接转发聊天记录给你

  • @Ta / 2023-06-16 / /

    @无名啊 除了你说的 X Y Z 还要考虑C(Client),比如不同客户端之间的消息同步;一个人对应一个消息队列,每个消息后面对应不同标签(私聊,群聊 公众号...),一个新设备上线默认拉取前N条消息,已在线设备通过心跳保证每次只同步最新消息。
    ~~~

  • @Ta / 2023-06-17 / /

    @㝶芾厶眵攴䭡,Emm。。是没考虑到。

    仔细想想,这部分占用的服务器资源应该不大?

    因为最繁重的汇集各处来源信息,以及构造维护消息队列,已经完成了,充其量只是再多分发几次?

    直播弹幕、音视频流等,分发给全国观众都不成问题。这点文本分发,相信也不会太为难腾讯的服务器?

添加新回复
回复需要登录