使用基于到期的缓存时,棘手的事情是,你必须在首次从服务器拿到数据时指定缓存生命周期(TTL)。之后,你没有任何机会将缓存数据删除。它将由浏览器缓存提供到 TTL 到期的时刻。对于静态资源,这不是一件复杂的事情,因为它们通常只会在你部署 web 应用程序的新版本时发生变化。因此,你可以使用 gulp-rev-all 和 grunt-filerev 等很酷的工具)对 assets 进行散列。
但是,但是你该如何处理运行时的应用数据加载和修改呢?更改用户个人资料、更新帖子或添加新评论似乎不可能与浏览器缓存结合使用,因为你无法预估此类更新将来何时会发生。因此,缓存只能被禁用或使用非常小的 TTL。
由另一个客户端更新时,缓存动态数据如何过时的示例
Baqend 的 Cache-Sketch 方法在 Baqend,我们已经研究并开发了一种方法,在实际获取之前,检查客户端中 URL 的陈旧度。在每个用户会话开始时,我们获取一个非常小的数据结构,称为布隆过滤器(Bloom Filter),它是所有过时资源集合的高度压缩表示。通过查看布隆过滤器,客户端可以检查资源是否过时(包含在布隆过滤器中)或者是否是全新的。对于潜在的过时资源,我们绕过浏览器缓存并从 CDN 获取内容。在其他的所有情况下,我们直接用浏览器缓存提供内容。使用浏览器缓存可以节省网络流量和带宽,并且是很快的。
此外,我们确保 CDN(以及其它基于失效的缓存,如 Varnish)始终包含最新的数据,只要它们过时就立即清除资源。
Baqend 如何确保缓存动态数据的新鲜度示例
布隆过滤器(Bloom filter) 是具有可调误报率的概率数据结构,这意味着集合可以用来表示对从未添加的对象的遏制,但永远不会删除实际条目。换句话说,我们可能偶尔会重新验证新资源,但是我们永远不会提供过期数据。注意,误报率非常低,这使得我们能够让集合非常小。例如,我们只需要 11 Kbyte 来存储 20,000 个不同的更新。
Baqend 在服务器端有很多流处理(查询匹配检测)、机器学习(*** TTL 估计)和分布式协调(可扩展的布隆过滤器维护)的工作。如果你对这些细节感兴趣,看看这篇 文章 或 这些幻灯片 来深入研究。
性能收益这一切都归结为这一点。
使用 Baqend 的缓存基础设施可以使哪种页面速度得到提高?
为了展示使用 Baqend 的好处,我们在后端即服务(BaaS)领域中的每个领先竞争对手上构建了一个非常简单的新闻应用,并观测了来自世界各地不同位置的页面加载时间。如下所示,Baqend 持续加载低于 1 秒,比平均速度快 6.8 倍。即使当所有客户端来自服务器所在的同一位置时,由于有浏览器缓存,Baqend 也是 150% 倍速度。
简单新闻应用的平均加载时间比较
我们将此比较作为一个 来比较 BaaS 竞争。
动手比较 的截图