1.
楼主
@加勒比海带 于 2023-06-15 20:01 删除了该楼层,理由如下:
无关评论
2.
@加勒比海带,是,所以QQ群有人数上限,就是为了避免单个群连接数太高服务器撑不住,以及形成广播风暴(每发一个消息就要转发给几千人这种)。限制为几百人是比较合适的。
至于具体的实现,可以采用消息中继模型:
- 我只与负责我登录的服务器联系。群里的其他人各自在他们的服务器,和我可以不在同一个服务器。
- 每个群都有一个专门负责的服务器进行中继。
- 有人发消息时,先发给自己的服务器,然后自己的服务器把消息转发给对应群的中继服务器,中继再查找各个群成员在哪个服务器,并逐一转发。最后群里的所有人都收到了消息。
- 此时设置群成员上限就很有必要,否则每次发消息都相当于给所有服务器都发了一遍,形成广播风暴。
3.
@老虎会游泳,那直播弹幕那种呢?几十成百上千万用户直播间那种。。
5.
@无名啊,因为每个直播都是一个单独的连接,不需要考虑多个群共享连接,所以采用CDN模型就行了,由一个中心服务器负责发送消息,然后逐级分发给全国CDN,每个人收到的消息都一样。发弹幕则是统一发给那个中心服务器。
6.
@老虎会游泳,不是发一个弹幕,就要转发给其他 几十成百上千万用户 咩。。
8.
@无名啊,直播间弹幕甚至可以像直播本身一样通过无状态HTTP服务器分发,按时间切片放在不同的json文件里,然后由一个列表(类似m3u8)不断列出最新的json文件名,由播放器自行下载展示。这样就能用分发直播视频流的渠道分发弹幕了。
9.
QQ客户端和服务器之间有心跳机制,客户端通过周期性心跳上报,可知道什么时候需要拉消息
或服务器知道什么时候推消息
~~~
10.
@老虎会游泳,群聊风暴的问题,我是使用了group_id赋予群的内部编号,这样系统逻辑需要推送的时候,只要解析这个id就知道具体的分布式中的目标gateway的ip:port,这样就不会造成群惊了,
,
11.
@加勒比海带,我与老虎讨论,老虎给我出了一个接近90%完美方案,还有10%是因为没有经过大规模实践不确定因素。
大致就是: 微信私我,给你发我总结的原理截图
12.
顺便一提直播弹幕,我觉得最有趣的方法是直接把弹幕嵌在视频流的字幕轨里,这样只要前端加个字幕轨提取代码就行了。视频编码器那边,加字幕的工作交给切片服务器就行了,切片是很简单的工作,顺便混合一下字幕不会有什么额外开销。唯一的问题是审核,想删掉嵌入视频的弹幕比较困难
13.
@老虎会游泳,那个收弹幕的中心服务器,性能一定很强吧,要接收全国这么多用户的弹幕。。
说来也是,直播的数据量比聊天、弹幕大多了,基本也都全送达了
直播弹幕嵌在视频里,这想法挺新奇啊。
就是设置 全屏/半屏/四分之一屏弹幕、弹幕关键字屏蔽 等功能会不会不方便了。。
14.
@无名啊,可以负载均衡啊,一个直播间对应一个弹幕服务器就行了。
减少弹幕数量和屏蔽的功能都可以在前端实现,字幕轨只是用于提取弹幕内容。
15.
@老虎会游泳,让我理理:
- QQ群聊:用户发消息 -> 最近服务器 -> 群所属中继服务器 -> 其他所有成员所在服务器 -> 其他成员接收
- 直播弹幕:用户发弹幕 -> 最近服务器(可能随机丢弃) -> 直播间所属弹幕服务器(只需处理一次,可裁剪弹幕) -> CDN -> 观众
所以,QQ群聊的每一条消息,服务器都要针对每个成员单独处理,无法重用。
如果一个人平均会加入 X 个群,平均每个群有 Y 个成员,平均每人每天发 Z 条消息,则一天消耗 用户数XY*Z 次服务器资源。
要节省服务器开支,则 X、Y、Z 都要限制?
而直播弹幕,对于某一个直播间,服务器可收集用户发送的全部/部分弹幕,并裁剪成如每秒最多 1000 条弹幕,再分发?
即,可针对所有观众统一处理弹幕,重用性贼高?
17.
@加勒比海带,,苹果手机不支持长截图,我可以直接转发聊天记录给你
18.
@无名啊 除了你说的 X Y Z 还要考虑C(Client),比如不同客户端之间的消息同步;一个人对应一个消息队列,每个消息后面对应不同标签(私聊,群聊 公众号...),一个新设备上线默认拉取前N条消息,已在线设备通过心跳保证每次只同步最新消息。
~~~
19.
@㝶芾厶眵攴䭡,Emm。。是没考虑到。
仔细想想,这部分占用的服务器资源应该不大?
因为最繁重的汇集各处来源信息,以及构造维护消息队列,已经完成了,充其量只是再多分发几次?
直播弹幕、音视频流等,分发给全国观众都不成问题。这点文本分发,相信也不会太为难腾讯的服务器?