登录 立即注册

首页 > 绿虎论坛 > Wine游戏助手 > 讨论/求助 (发帖)

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

作者: @Ta

时间: 2023-06-14发布,2023-06-16修改

点击: 25493

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

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

https://www.chengyao.xyz


[隐藏样式|查看源码]


『回复列表(19|隐藏机器人聊天)』

1.
楼主 @加勒比海带 于 2023-06-15 20:01 删除了该楼层,理由如下:

无关评论

(/@Ta/2023-06-15 14:33//
被锁定
)

2.

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

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

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

3.

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

(/@Ta/2023-06-15 15:24//)

4.

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

(/@Ta/2023-06-15 16:00//)

5.

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

(/@Ta/2023-06-15 16:01//)

6.

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

(/@Ta/2023-06-15 16:10//)

7.

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

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

8.

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

(/@Ta/2023-06-15 16:34//)

9.

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

(/@Ta/2023-06-15 17:08//)

10.

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

(/@Ta/2023-06-15 19:44//)

11.

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

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

(/@Ta/2023-06-15 21:04//)

12.

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

(/@Ta/2023-06-15 21:09//)

13.

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

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

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

(/@Ta/2023-06-15 23:48//)

14.

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

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

(/@Ta/2023-06-16 08:11//)

15.

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

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

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

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

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

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

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

(/@Ta/2023-06-16 12:40//)

16.

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

(/@Ta/2023-06-16 13:58//)

17.

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

(/@Ta/2023-06-16 15:57//)

18.

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

(/@Ta/2023-06-16 17:39//)

19.

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

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

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

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

(/@Ta/2023-06-17 06:17//)

回复需要登录

11月1日 07:58 星期五

本站由hu60wap6华为CPU驱动

备案号: 京ICP备18041936号-1