文章插图
代理转发模式下,nginx_http_upstream_init_request 函数作为该模式的入口函数,将此函数注册到 nginx_http_upstream_process 中,当进入调用链时,将需要监控的 epoll 句柄加入到nginx_add_event 中,在和上级源站建立连接成功后或者有数据交互时,epoll 监控到的句柄被触发,从建立连接,发送请求,接收数据(此过程称为代理回源) 。
在数据接收流程中,ngx_event_accept函数作为该模式的入口函数,在系统启动时,通过注册到 nginx_event_process_init 函数中,将需要监控的 epoll 句柄加入到 nginx_add_event中 。当有客户端请求时,epoll 监控的句柄被触发,进而对连接请求进行处理 。
2.2 数据录制模块设计与实现
Nginx 目前没有提供支持 HLS 或者 TS 协议的录制模块,本文采用 epoll 异步通知机制,设计录制模块,数据录制模块异步线程调用关系图如下所示:
文章插图
上图中,Proxy 线程与文件 I/O 线程都是 Nginx 自带的模块 。Proxy 线程负责接收来自于源站的请求数据,它将每个请求的文件描述符 fd 句柄加载到 epoll 中,再分发到各个录制线程中,同时通过调用 submit_task()接口把录制任务传递到录制线程中 。录制线程则是把接收到的录制任务数据进行整合(包含对录制任务数据进行拼装、去重、校验、容错等步骤)后,同样将对应的文件描述符 fd 句柄加载到 epoll 中为 I/O 线程进行调用,同时调用 submit_task()接口进行异步写盘 。在进行异步写盘时,默认写盘数据大小一般设置 1MB 作为基本单位,这是因为当写盘数据大小高于或是低于 1MB 时,内部存储器调用 read()函数次数过多,会导致 CPU过高,且数据排列组合多,浪费时间 。因此选择 1MB 作为基本单位进行数据写盘时效率最高 。文件 I/O 线程负责接收录制线程发送来的数据,是 Nginx 已封装好的模块,可以直接调用 。
2.3 流媒体服务器数据缓存模块设计
在传统的 Nginx 流媒体服务器中,只有直播业务会采用缓存机制(Cache),但对于点播业务来讲,传统的 Nginx 流媒体服务器没有 Cache 机制 。点播业务会采用直接读取磁盘上数据文件的方式,这种方式会导致磁盘 I/O 读写频繁,不仅影响系统效率,还会加速磁盘老化 。因此,本节基于 Nginx 流媒体服务器,在点播业务上新增缓存模块,流媒体服务器会先从 Cache模块中获取所需要的数据,如果 Cache 模块中没有找到,才会从本地磁盘进行读取,这大大减少了磁盘的读写,从而减少系统开销,使性能得以优化与提升 。
(1)Cache 模块模型架构
Cache 模块包含了 Cache 模块与本地磁盘的交互方式 。当客户端发起请求后,数据接收模块会根据请求内容在 Cache 模块中寻找对应文件内容 。Cache模块中的 Cache_read()函数和 Cache_open()函数分别负责对内容资源的读取与打开 。请求来临时,服务器会根据用户请求所对应的文件描述符 fd 调用 Cache_read()函数进行内容读取,之后调用 Cache_open()函数打开文件 。若此时从 Cache 模块中获取到了相应资源,则直接将资源交由 Shaper 模块进行发送处理;若没有从 Cache 模块中获取到相应资源,则会根据文件描述符 fd 从本地磁盘中进行查找 。
(2)本地磁盘包含两大模块,分别为 IO_open 模块和 IO_read 模块,其功能与 Cache 模块中的 Cache_read()函数和 Cache_open()函数类似,负责对内容资源的读取与打开,但调用方向有所区别 。
当在 Cache 模块中没有获取到索要找寻的数据时,会先调用本地磁盘的 IO_open 模块将文件打开,并将文件描述符 fd 返回给 Cache 模块中的 Cache_open()函数,之后调用 IO_read模块进行文件内容读取,并将读取的内容返回给 Cache 模块中的 Cache_read()函数 。这样一来,Cache 模块中的数据会得到及时更新,当请求相同的资源时会直接从 Cache 模块中进行读取,从而减少了对本地磁盘的操作 。对于长时间没有被请求的内容 Cache 模块会对其定期清理 。Cache 模块模型架构图如下所示:
文章插图
Cache 模块从功能层面来讲可以分为两大部分:
(3) Cache_block:用于存储文件数据块的内容和相关信息 。
(4) Cache_file:是应用层进行文件操作的基本单元,使用文件句柄 Cache_fd 作为基本凭证 。Cache_file 包括两种 block,分别为 cache_block_list 和 uncached_block_list,如下图所示:
推荐阅读
- 绿茶功效与作用,绿茶粉的功效与作用,1
- 与王阳明齐名的人 王阳明最好的朋友
- 曼松茶的功效与作用,杨聘号祥凤曼松王子茶全面上市
- 白茶的功效与作用,茉莉毛尖属于什么茶茉莉花茶毛尖的功效与作用
- 龙桑茶的功效与作用,茉莉毛尖属于什么茶茉莉花茶毛尖的功效与作用
- 高考英语听力应试技巧与策略
- 绿茶粉怎么制作面膜,绿茶粉的功效与作用,1
- 碧螺春和龙井功效对比,西湖龙井的功效与禁忌
- 碧螺春茶的功效与作用,碧螺春的功效,喝碧螺春的好处
- 百合枣仁茶的功效,百合花茶的功效作用与泡法