搭建一个在线直播系统需要满足的基本功能
- 流畅稳定的直播系统,满足师生音视频互动
- 对直播课程进行录制,方便学生复习老师可以
- 分享PPT、视频、图片等,便于教学
- 有丰富的互动功能,比如抢题答题等
- 能够供老师书写的白板
- IM等
其中“直播”功能是最核心和最复杂的功能,可以用第三方现成,如阿里云,腾讯云(TRTC)的流媒体服务,并且使用他们的服务还能够解决录播,点播等功能。而其他功能交互 和实时性比较强,但也能够用框架解决。
问题演变成可以用 云服务 + 类似一个 即时通讯系统的服务解决。
技术栈
这样的系统通常使用性能比较高的框架来开发
- Netty:高性能网络框架,它帮我们屏蔽了网络底层复杂通信逻辑,提供简单易用的api
- Protobuff : 性能好,主要体现在 序列化后的数据体积小 & 序列化速度快,最终使得传输效率高
针对不同序列化技术进行性能比较: https://github.com/eishay/jvm-serializers/wiki
- Kafka: 因为服务不是部署在一个机器,需要集群部署,部署多个服务需要做消息分发。kafka具有I/O高吞吐量读写高性能,利用redis存储每个连接用户所在的服务器分区,不同分区消费,扩展本地路由和远程路由,实现各个netty服务直接的通讯,消息分发找到用户所在的机器才进行相关业务逻辑处理。
- Redis :Redis存储用户连接的机器,结合本地路由(确定连接是否是本地)和远程路由(确定连接所在机器,即kafka消费分区)。
- RabbitMq:还有很多场景都需要流量削峰或者解耦,可以利用mq来实现,比如画板的记录需要按天永久保存的话,可以通过Mq排队上传,登录时如需要 就加载上次画板的内容历史记录 拉下来解释。
其中
- 客户端通常 使用obsproject来进行直播和录播
- 直播和录播是两个不同的URL,不会有冲突(拉流可以理解为一个客户端播放器 播放拉流的URL,推流主要就是客户端不断截取某个界面的信息 推送到推流地址(了解下:obsproject),所以这两个步骤需要网络带宽支持 不然有可能帧数比较模糊 或者 有一点延迟或卡机,需要保证网络以及客户端的高质量支持)
- 白板的功能可以用Qt画的一些界面笔画,每次如:鼠标按下,滑动,鼠标释放都会产生事件 并且把携带的数据一起到服务端,这样其实画板的占用的流量很少,基本不会造成卡顿。
- 客户端可以定时采集网络 内存 cup的占用状况等发到服务端,可以对每个用户的网络等进行一个监控
总体架构
https://github.com/David0101/Teaching-Online.git