今天简单记录一下弹幕服务器的设计思路,希望对大家有所帮助。

业务特点

弹幕典型的进少出多场景,一个房间如果有10W观众,每秒提交的弹幕也许只有1000次,但是广播弹幕给所有观众需要1000 * 10W次。

单机模型

为了推送消息,长连接几乎是必然的选择。

每个房间有若干观众,所有房间的观众都连接在1个服务进程上。

当弹幕提交上来,根据房间找出所有房间内的在线用户,循环将弹幕推送给他们。

假设1个服务进程的消息网络吞吐能力是50万次/秒,那么一个10万观众的房间,每秒提交5次弹幕就会达到服务端极限性能。

多机模型

假设一个直播间仍旧有10万人在线,希望解决每秒5次弹幕就达到性能瓶颈的问题,很容易想到能否横向扩展解决。

假设现在有2台服务器,10万人均匀连接在2台服务器上,也就是一台有5万人在线。

现在任意用户发送1条弹幕到A服务器,那么A服务器推送5万次,并且将弹幕转发给B服务器,B服务器也只需要推送5万次。

假设要达到A,B服务器的极限,只需要每秒有10条弹幕即可。。。那么横向扩展的收益就这么小吗?

显然有更不为人知的秘密存在。

批量模型

实际上,如果每个弹幕推送都作为一个独立的tcp包发送,那么网卡将很快达到瓶颈,因为几乎每个包都要经过一次内核中断交付给网卡,从而送出到网络中,这对网卡是不友好的。

根据实测经验,万兆网卡的每秒发包量大约在100-200万之间,之前我举例说50万次/秒实际说的比实际情况少一些。

如果可以减少网络发包的次数,那么就可以解决网卡的瓶颈,从而突破每秒广播50万人次弹幕的瓶颈。

思路就是批量,可以将原本要立即发送给观众的弹幕缓存起来,每间隔1秒将这些缓存的弹幕作为一个整体,发送给各个观众的tcp连接。

在这样的实现下,无论每秒是50条弹幕还是10000条弹幕提交到服务端,每秒的推送网络调用次数都是10万人次,也就是按秒为单位聚合弹幕,这样网络调用次数只与在线观众数相关了。

依旧是之前的服务器性能(极限每秒50万次网络调用),那么可以支撑50万观众同时在线,每秒将1秒内缓存的弹幕作为整体发送给50万观众,也就是这一秒只有50万次的网络调用,在网卡的承受范围之内。

在网络这一块来说,通过增加单次发送包的大小可以减少发包数量,提升带宽利用率,每秒送达的弹幕数量并没有受到影响(虽然每秒能够发出的包个数少了,但是单个包内有很多弹幕,总体保持不变),即延迟换吞吐。

接下来呢

从bilibili的弹幕服务压测数据来看,单个服务器单机每秒下发3500万+弹幕,承载大约100万的在线观众,单次发送打包的弹幕数量大约是3500万/100万=35条的样子,也就是每秒35条弹幕提交到服务端,然后打包广播给所有观众,带宽成为了瓶颈。

在观众数量不变的情况下,即便每秒提交10000条弹幕,那么瓶颈也只在带宽(推送的打包变大了)和CPU(聚合消息),只要观众数量变成80万,那么带宽又将有更多的冗余,CPU也会相应降低。

整个弹幕系统的瓶颈再也并不是每秒的弹幕数量了,而是观众数量决定:

每秒网络发送的次数=观众数量!=弹幕数量

这是很重要的结论!通过增加服务器均分观众,那么每台服务器每秒的推送次数就可以减少,只要集群有足够大的出口带宽,那么一切都不是问题!

架构

设计系统都讲究无状态,这样做复杂度最低。

其实弹幕本质算是IM系统,IM系统一般支持1对1,1:N的聊天方式。

IM系统在扩展性方面有一些惯例,下面基于bilibili的弹幕架构简单说说原理。

comet是网关,无状态,负责客户端长连接和消息收发。

logic是逻辑服务器,无状态,做业务逻辑用,保持comet逻辑单一高性能。

router有状态(内存状态),logic通过用户uid一致性哈希保存用户的会话信息在某个router。

一个uid可以进入多个房间,建立多条连接到不同comet,而每个直播间在不同服务器上都可能有用户在线。

用户向房间发弹幕直接通过HTTP协议调用logic服务,而logic直接发给kafka,由job服务消费广播给所有Comet。

用户也可以定向发送消息,可能直接发给个人,发给某个房间,发给全部房间。

发消息给个人的话logic查询router,获取uid在哪些server上的哪些room。然后向kafka上推送一条记录,由job服务将消息广播给这些server上的room,这样无论该用户在N个直播间里任意一个都可以看到推送。

发送全部房间和发送一个房间类似,就是由job广播给所有comet,然后每个Comet给所有用户发消息。

性能

其实推送有个程序设计问题,就是要推送的用户量很大,而用户频繁的在上线与下线,因此在线用户集合是上锁的。

推送就要遍历集合,所以很矛盾。

这个问题只能通过拆分集合实现,每个集合只维护部分用户,通过UID哈希分片。

推送消息时,逐个遍历每个小集合上锁处理。推送某个房间也是类似的,只需要遍历每个小集合,在小集合里找出对应房间的用户即可。

扩展阅读

bilibili的弹幕系统是开源的,感兴趣可以详细分析他的代码,用的是golang标准库的rpc,额外依赖了kafka,整体设计还是不算复杂的。

弹幕服务器维护,分布式弹幕服务架构相关推荐

  1. git服务器维护 备份,gitlab服务运维,备份与恢复 - 橙子柠檬's Blog

    gitlab服务运维工作 Gitlab-ctl 使用gitlab-ctl start          #启动服务 gitlab-ctl stop           #停止服务 gitlab-ctl ...

  2. 刀锋铁骑服务器维护,刀锋铁骑 - 服务退换中心 - 腾讯游戏

    亲爱的各位用户: 感谢您一直以来给予<刀锋铁骑>的支持和厚爱! 由于游戏运营策略的调整,我们怀着万分遗憾的心情宣布<刀锋铁骑>即将终止运营.停运具体事项安排如下: 1.2021 ...

  3. 一年规划: 服务器后端+分布式+微服务+具有产品思维,20210504

    五一: 川藏铁路 中国商业,如宝万之争,真功夫家族股权之争,太子奶,三一重工/中联钢铁等等, 中国,八纵八横 目标: 4. vim-go 5. golang的数据结构底层实现 6. golang协程, ...

  4. 交管12123服务器维护,交管12123服务异常怎么办?交管12123 APP服务异常解决方法...

    交管12123APP是可以随时为你查询违章.缴纳违法费用等服务的软件,也是一款专门为了驾校考试研发的软件,但是最近很多用户发现登录时会遇到服务异常的问题,那么,要怎么解决这个问题呢?接下来,小编就为大 ...

  5. 【架构】分布式服务架构与微服务架构

    文章目录 0)服务相关架构的演变 *关于面向对象.面向组件.面向服务 1)面向服务架构(SOA) 1.1 什么是面向服务架构(SOA)? 1.2 为什么需要SOA? 1.3 SOA 的特征 1.4 S ...

  6. 微服务架构和分布式架构的区别

    微服务架构和分布式架构的区别有: 1.含义不同: 2.概念层面不同: 3.解决问题不同: 4.部署方式不同: 5.耦合度不同. 其中,含义不同指微服务架构是一种将一个单一应用程序开发为一组小型服务的方 ...

  7. 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进

    1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...

  8. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  9. 【.net core】电商平台升级之微服务架构应用实战

    一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服 ...

  10. 微服务架构与开源框架

                                             微服务架构介绍及实践 微服务现在是一个很火的概念,尤其是搞IT的大多数都对其有所了解. 到底火到什么程度呢?2016年 ...

最新文章

  1. linux bash shell 常用快捷键
  2. pjax 历史管理 jQuery.History.js
  3. Ubuntu下嵌入式Qt开发环境配置全攻略
  4. 蚂蚁金服与阿里云宣布启动“蚂云计划”
  5. 在 VMware ESXi 5.5 和 6.0.x 中支持大于 2 TB 的虚拟机磁盘 (2058287)
  6. 域控服务器取消验证_AD域控
  7. 火山翻译亮相飞书未来无限大会,打造全新翻译体验
  8. Sql Server 的增删改查
  9. BS7799系列讲座:HTP模型图及构建(转载)
  10. 三插头内部结构图_两脚插头和三脚插头区别是什么 插座的结构特点有哪些
  11. 云服务器测速脚本_VPS服务器常用性能测试脚本
  12. 雷柏MT750w鼠标无线蓝牙连接教程
  13. CSDN 编程挑战 博弈游戏2 斐波那契
  14. android TeleComm Telephony Dialer之间的说明
  15. 数据库基础:基本概念
  16. amesim子模型_Amesim中液压管路模型的选择方法
  17. 2021年场(厂)内专用机动车辆安全管理证考试及场(厂)内专用机动车辆安全管理模拟考试题库
  18. 初识 MQTT——IBM
  19. css实现入场动画、炫酷、跑马、流水
  20. 软件工程 第九章:部署图

热门文章

  1. C/C++中控制循环结构语句:break;continue;
  2. 全国计算机网络考试和答案,全国计算机三级《网络技术》复习题及答案2017
  3. OpenCasCade开发环境搭建
  4. C++中L和_T()之区别
  5. 日报系统、周报系统如何便捷使用?——领导篇
  6. d盾web查杀 linux,D盾Web查杀
  7. nc加载不了java,用友NC系统使用过程中常见问题和解决方法
  8. ecg 幅度_精确心电图(ECG)信号处理
  9. 03-SSH server config
  10. UnityWebPlayer使用(1) 单机环境下在WinForm中使用Unity3d