这是也是实现各种C++服务的基础,业务通过这三大基础进行构建。
EventLoop,它通过事件驱动程序的流程,所处理的是IO和定时器事件。
它的实现都是基于IO复用机制,比如Linux的epoll。现在有很多开源事件库实现,比如libevet,libuv,asio等,不同的实现,主要是在性能,功能,和跨平台上做文章来突出差异化。
通过reactor模式实现EventLoop并不复杂(不追求跨平台和性能的情况下)。在流媒体服务领域,咱们手搓一个基于linux epoll的事件循环就足够满足IO需求,毕竟流媒体服务主要指标并不在IO上。
ZLMediaKit中的EventLoop
就实现的比较好,封装性好,代码简明,作为流媒体服务的IO性能已够用。
并发模型,是指服务是多线程还是多进程。会出现多进程多线程,单进程多线程,单进程单线程,多进程单线程的各种模式。
现在服务器的实现大多采用了多线程模式,即多进程多线程或单进程多线程,ZLMediaKit是单进程多线程服务,虽然它有两个进程,但是其中一个是守护进程,并不处理业务。
对rtc流媒体服务,一般都是采用单线程多进程模式,主要是规避对锁的使用及线程切换的开销,来保证足够实时性。
多线程的模型中线程通常是于EventLoop
结构在一起的,即Event Loop per thread
。可以看看这篇文章介绍的ZLMediaKit的线程。
C++有两种错误处理方式:
C++中比没有统一的方式,所以错误处理的方式,是处于各取所爱的状态。在ZLMediaKit中,使用的异常的方式。但是不管用哪种方式,都要达到以下要求:
可以看看这个链接 C++异常。
rtc流媒体服务运用在rtc系统中,比如腾讯会议,声网。rtc中的流媒体服务主要目标是保证高效的转发,在基于udp/rtp协议的系统中,直接转发rtp包,不会转协议,不涉及到组帧,拆包,音视频同步。
ZLMediaKit,live555这类服务称为通用流媒体服务,支持多种协议。所以有转协议,组帧,拆包,还会做音视频同步。
rtc服务相比通用流媒体服务,转发效率高。通用流媒体服务则媒体业务丰富。这两种服务上实现的区别