最近自己尝试在基于 OpenResty 做一些简单的 CDN 相关的工作,尝试支持 ESI的时候查看资料看到了 Cloudflare Raigun 的介绍,他的实现方式感觉非常的漂亮,在不用在改变业务应用代码架构的时候达到了类似 ESI 的加速效果。
个人理解:就是将不能缓存的动态内容的 HTTP 请求(从源站到 CDN 节点之间的数据发送)从每次单一的全量发送变成两次请求数据之间的增量发送,进而减少源站的流出流量。该功能使用的时候需要在源站的服务器上安装 Cloudflare 提供的称作 Sender 端的软件。
其介绍中说到其思路有点类似于视频中 MPEG 相关的编码技术:视频在编码的时候,每一帧对应的图像信息并不是全量进行保存,而是通过某种算法(比如 运动补偿 )计算出相邻帧的差异部分(因为视频相邻帧之间的图像大部分是相同的),只需保存发生变化的增量部分就可以。
将一次 HTTP 请求类比为视频的一帧,那么在传输后面的请求时候通过某种方法能够计算出与前面请求的差异部分,就可以只需传递这部分增量,然后 CDN 节点收到增量后再与其本地缓存的前一次请求做合并处理后返回给用户。这样就能够极大的减少源站跟 CDN 节点之间的流量带宽。
由于自己对于视频相关技术并不了解,以上部分全是自己简单查资料后的理解,如有错误,请大家多多指正。
另外就是想问下有没有人已经做过类似的开源实现?
附 1: 5 年多前 Raigun 发布的时候 HN 上的讨论: Caching the uncacheable: CloudFlare's Railgun
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.