随着移动互联网的发展,视频通讯使用场景愈来愈多,如视频聊天、视频会议、在线直播等。可是随之而来对前端设计的要求、对后端服务器的要求也不断增长。因此如何搭建一个完善的服务器以适合视频通讯,是每一个视频通讯研发人员都关注的问题。前端
一个完善的音视频服务器须要解决高并发、低延迟、NAT穿透和扩展性负载均衡等问题,咱们关注这个方向已有一年多,下面是总结的部分经验:nginx
关于高并发c++
在这里主要介绍了如何设计互联网分布架构以提升系统并发能力。程序员
有两种经常使用的方法:垂直扩展(Scale Up)与水平扩展(Scale Out)。算法
1、采用垂直扩展来提高单机处理能力。数据库
写代码时,咱们能作的优化可分为三类:架构优化、算法优化和语言优化。后端
1架构优化:如用异步IO来增长单服务器吞吐量,多线程的时候经过减小锁的使用来提升服务器性能等。xcode
2算法优化:其在服务器中比较少见,由于服务器逻辑代码里一般没有繁琐的算法,可是若是有能优化的空间,仍是要进行优化。服务器
3语言优化:比较常见的优化方式,好比const加引用传参,好比复杂对象遍历时前置加加与后置加加等,具体看参阅《effective c++》和《more effective c++》。固然,若是有数据库,那么SQL语句的优化也算。网络
如今代码已经写好了,也跑起来了,发现性能仍是不满意,怎么办呢?
看瓶颈! 就比如医生治病,要先找病因。Linux下的gperftools、Windows下的vs、Mac下的xcode都能进行集成性能分析。
这些性能分析工具能帮助你大体定位到哪一行代码占用了CPU时间。找到病因后,就是对症下药。
固然了,对于这种主要因为占用CPU、内存不够和网卡而致使的服务器性能不高,提高硬件仍是很是有效的。
可是单机性能老是有极限的,会受到时代技术的限制。因此互联网分布式架构设计高并发的解决方案仍是要依靠水平扩展。
2、采用水平扩展来增长服务器数量,以扩充系统性能
这点与互联网的分层架构有关,在互联网的分层机构中,各层次水平扩展的实践是不一样的,好比:反向代理层经过“DNS轮询”的方式;站点层经过nginx来进行,而服务器则主要依靠服务链接池。在各层实施水平扩展后,经过增长服务器数量的方式,能够作到理论上系统性能的无限提高。
简单说就是,活太多时一我的干不完,多我的一块儿干。而后牵扯到多我的,必然会涉及到调度分配管理的问题。
相关的名词有:CDN,负载均衡,Hadoop,云计算等。
解决完高并发的问题,如今来讲一下低延时。
关于低延时
低延时是全部视频通讯研发人员都会关注的一个点,更低的延时必将提高用户使用体验。但是如何作到低延时呢?
图鸭的产品是采用了以下的方法:服务器采用udp协议传输音视频数据、tcp协议传输控制信令,以此来保证控制信令可靠且音视频数据传输延时低。
众所周知,UDP协议与TCP协议相比:采用UDP协议传输数据可能致使数据丢失,但客户端接收信息延时低;而TCP协议有丢包重传策略,但速度不快。咱们的产品在使用时,将这两者结合,以确保UDP在接收到的包不彻底时也能正常解包。
在解决了高并发和低延时的问题后,咱们要来考虑一下流量成本的问题。下降流量成本是每一个视频通讯使用者的需求,也是每一个研究视频通讯的程序员们要解决的问题。在这里我简单介绍下NAT穿透。
关于NAT穿透
(NAT穿透)
视频聊天的一大技术难点就是服务器的网络带宽占比太高。使用NAT穿透方案,客户端在通讯时能够采用P2P的方式。P2P方案可以使A客户端的视频数据不通过服务器到达B客户端,在下降服务器带宽消耗时保证传输低延时。
那么如何实现NAT穿透呢?咱们首先须要知道NAT的特性:NAT会拒绝陌生来源的数据包。简单来讲,若是NAT后不存在向某个NAT以外的主机发送过数据的主机,那么外部主机就不能主动发送数据包到NAT以后的主机。
一种可行的方案,是利用一个信令服务器,先获取客户端暴露在NAT上的IP:PORT信息,再协调两个客户端,朝其NAT上暴露的IP:PORT发送信息。因为处于NAT(这里设为NATA)后的机器向另外一个NAT(这里设为NATB)后的设备发送信息了,NATA就会容许NATB后的主机的数据。反之亦然。
可是还有个要点须要注意:先发送数据的客户端的第一个数据包会被NAT丢弃,由于对方NAT并不知道该如何分配这个未知来源的数据包。NAT穿透完整的解决方案能够参考RFC5389协议,根据协议实现。
关于扩展性强,负载均衡
(一种负载均衡方式)
在处理完上述问题后,能够考虑怎样让整个服务器负载均衡。
在这里图鸭君主要介绍主从节点集群设计:客户端从负载均衡服务器获取转发服务器地址,负载均衡服务器根据客户端的身份以及从节点服务器的带宽流量、CPU状况等,智能分配给客户端合适的服务器地址,在保证资源有效利用的同时又避免服务器过载。
这样的设计在提升了可扩展性的同时可以在从节点无缝加入主节点。
总结
事实上,前文所述的都是搭建高性能服务器的基础,好的架构是基础,好的优化才能盖高楼。对于如何更好地优化服务器?一种合理的作法是:对服务器的运行情况进行分析,对执行频繁、资源消耗太高的部分进行特别的优化。
也就是说对于具体的服务器具体分析,只有如此才能让服务器作到最优。