背景:
现有音乐/视频播放流程:1.前端根据资源地址进行资源播放 2.前端调用后台接口使资源播放量+1.
需求:
为了简化前端播放流程,将以上流程合二为一,通过资源地址后面加参数的形式,请求资源内容的同时调用后端接口做其他业务操作(统计播放、下载量等等)。
实现方式一:
Nginx-subrequest,http框架提供的一种分解复杂请求的设计模式。可以把原始请求分解成多个子请求,使得诸多请求协同完成一个用户请求。
实现步骤:
1.在nginx.conf文件中配置好子请求的处理方式
2.启动subrequest请求
3.实现子请求执行结束时的回调方法
4.实现父请求被激活时的回调方法
小结:此方法需要自己动手写c脚本,并添加模块到nginx中,参考网上c脚本的代码调试起来略复杂,没有成功。
实现方式二:
openresty,结合了lua脚本和nginx,能借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端服务。
实现步骤:
1linux服务器安装openresty
2把fastdfs-nginx模块编译添加到operesty-nginx中
3异步调用文件系统和后端服务
4获取文件系统调用结果并返回给客户端
小结:openresty给客户端返回数据会导致音视频播放存在bug,无法拖动进度条来进行快进,也可通过转发的形式来实现,但是转发之后,http请求则不再执行,可先执行http请求再执行转发,这样达不到异步调用的效果,对文件访问会有一定影响。
实现方式三:
ngx_http_mirror_module,nginx的流量复制模块;nginx 1.13.4及后续版本内置此模块,镜像请求不影响源站请求及响应,源站(指我们的文件系统)请求完后直接返回,源站nginx-server将流量复制到mirror站(指我们的后端服务)后,两者不再有任何交集(即文件系统流量复制到后端服务后,两者互不干扰)
实现步骤:
1linux服务器安装1.13.4的后续版本
2把fastdfs-nginx模块编译添加到nginx中
3nginx源站配置和镜像站点配置
小结:实现了一个url同时访问文件系统和调用后端接口,且后端接口调用结果不影响文件的访问。