简单的cdn实现设想

本文纯属YY。

DNS智能解析

关于DNS的就近解析并没有做调研,商业产品可以使用cloudXNS,目标是用户解析得到的IP距离自己最近。

反向代理缓存

这个产品比较多,例如ats、varnish、squid等。

由于这些产品的缓存都是按URL为粒度的完整结果缓存,所以如果是视频最好是做分片存储(因为它很大),这样每个片段就可以被完整缓存了,这要求前端用h5或者flash播放器分段的加载视频,并且后端提供API获取视频的meta信息。

数据源服务

首先选择一个分布式文件系统作为存储,Youtube采用bigtable(类似hadoop)保存视频,我们可以考虑淘宝tfs做图片存储,hadoop做视频存储。

再者,因为下载图片和视频都比较大,所以需要采用HTTP分块传输协议,而不是全部读到内存里再发送回去。

这种持续不断的从文件系统读取内容,并发送给请求者的场景比较适合Golang完成,协程天然支持并发异步IO。

在Golang中使用http模块实现服务,当请求到来后只需要通过一个for循环逐段的从分布式文件系统获取数据片段,然后向http请求的responseWriter吐出数据片段即可实现源源不断的流式传输了,相关例子看这里。(细节需要优化,例如:读文件和写应答作为2个独立协程,中间通过channel做缓冲,从从而提升吞吐)

关于视频分段

这里只是举个例子,并没有经过实践。

用户上传视频时,客户端提交视频总大小给服务端,服务端可以按照100MB一段的规则,为每一段生成唯一编码,返回给客户端。

客户端然后逐段上传100MB的视频片段(比如你是想用PHP这种内存受限技术手段处理请求),服务端接收视频片段保存到分布式文件系统中,并标记相关片段上传完成,如果所有片段已完成那么服务端将标记视频已经完整,上传结束。

之后可以通过离线任务将上传完整的视频所有100MB片段下载到一台机器上拼装成完整内容,按视频协议进行帧解析,然后再按帧边界在20MB左右的位置重新进行切分,然后重新上传到分布式文件系统,并将分段信息写入到meta表。

此后,这段视频即可对外播放,浏览器首先获取meta(可以参考m3u8协议),然后访问CDN逐段加载20MB的视频片段进行连续播放。

 

 

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~