最近自己尝试在基于 OpenResty 做一些简单的 CDN 相关的工作,尝试支持 ESI的时候查看资料看到了 Cloudflare Raigun 的介绍,他的实现方式感觉非常的漂亮,在不用在改变业务应用代码架构的时候达到了类似 ESI 的加速效果。
个人理解:就是将不能缓存的动态内容的 HTTP 请求(从源站到 CDN 节点之间的数据发送)从每次单一的全量发送变成两次请求数据之间的增量发送,进而减少源站的流出流量。该功能使用的时候需要在源站的服务器上安装 Cloudflare 提供的称作 Sender 端的软件。
其介绍中说到其思路有点类似于视频中 MPEG 相关的编码技术:视频在编码的时候,每一帧对应的图像信息并不是全量进行保存,而是通过某种算法(比如 运动补偿 )计算出相邻帧的差异部分(因为视频相邻帧之间的图像大部分是相同的),只需保存发生变化的增量部分就可以。
将一次 HTTP 请求类比为视频的一帧,那么在传输后面的请求时候通过某种方法能够计算出与前面请求的差异部分,就可以只需传递这部分增量,然后 CDN 节点收到增量后再与其本地缓存的前一次请求做合并处理后返回给用户。这样就能够极大的减少源站跟 CDN 节点之间的流量带宽。
由于自己对于视频相关技术并不了解,以上部分全是自己简单查资料后的理解,如有错误,请大家多多指正。
另外就是想问下有没有人已经做过类似的开源实现?
附 1: 5 年多前 Raigun 发布的时候 HN 上的讨论: Caching the uncacheable: CloudFlare's Railgun
1
rhwood 2017-10-26 12:12:10 +08:00
可以看一下 varnish
|
2
risent OP @rhwood 之前的架构就是 nginx+varnish,后来接触 OpenResty 后感觉 Lua 的可控性和可扩展性比 VCL 强很多,并且 nginx 少不掉,那么就把 varnish 的功能直接继承进 nginx 了,这样只用维护 nginx 就够了。
|
3
scriptB0y 2017-10-26 21:48:09 +08:00
|
4
risent OP @scriptB0y 嗯,不一样,不过 varnish 是内置支持 ESI 的。
从效果上说的话 Cloudflare Railgun 就是通过透明化不需要改动应用层的业务逻辑 自动化的达到了 ESI 的效果。 类似的还有 Google 之前推出过一个 SDCH (Shared Dictionary Compression for HTTP) 的协议,Chrome 从 2008 年起就支持,但是后语需要更改后端业务层的逻辑才能起到压缩效果,一直推广不开来,前不久在 Chrome 59 中被 Google 把该功能移除了。 |