Netflix 通过引入一种区间感知(interval-aware)缓存策略,提升了 Apache Druid 的查询效率,大约 84%的分析结果可以直接由缓存返回,并使查询负载降低了约 33%。这一优化主要面向滚动时间窗口仪表盘,因为这类仪表盘会持续刷新查询,而时间范围仅有轻微移动,传统上这会导致重复计算,并反复扫描大型的数据集。
在 Netflix 这样的规模下,实时分析系统需要处理数万亿行数据,以支撑用于监控、实验以及运营决策的各类仪表盘。这些仪表盘会频繁执行几乎相同的查询,例如,滑动时间窗口上的错误率或用户参与度指标。尽管每次查询的意图保持不变,但时间边界的细微变化会让传统缓存系统把它们视为彼此不同的请求,从而在Apache Druid中造成较低的缓存复用率和重复计算。
Hello Interview 联合创始人Evan King在一篇帖子中这样描述这一挑战:
像“过去 3 小时内的错误数”这样的重复查询,尽管其底层大部分数据并未发生变化,但在传统缓存中仍会被当作不同请求来进行处理。
Netflix 的方法会把查询结果拆分成与时间对齐的片段,以便在相互重叠的滚动时间窗口查询之间实现复用。系统不会缓存完整的查询输出,而是为固定的时间区间保存中间聚合结果。当新查询到来时,时间窗口中稳定的历史部分会复用已缓存的片段,而只有最新的时间区间才会从 Druid 重新计算,并与缓存结果合并。
/filters:no_upscale()/news/2026/05/netflix-druid-interval-cache/en/resources/1Screenshot%202026-04-24%20at%209.46.21%E2%80%AFPM-1777092444864.png)
查询结构与缓存键分离(图片来源:Netflix博客文章)
Netflix 工程师Ben Sykes强调了这一方法的一个关键动机和成果,他指出:
发往 Druid 的查询量下降了 33%,P90 查询时间改善了 66%
在 Netflix 的规模下,Apache Druid 中超过 10 万亿行的数据使重复的滚动时间窗口查询成为一个主要的瓶颈。缓存层通过使用与粒度对齐的桶以及指数型 TTL 策略来应对这一问题,从而能够对历史区间进行长时间缓存,同时保持近期数据的新鲜度。这在数据准确性与性能效率之间取得了平衡。从架构上看,该缓存层以外部代理的形式运行,它会拦截传入的查询,将查询结构与时间区间分离,并生成可复用的缓存键。缓存片段存储在分布式键值系统中,从而能够独立过期并被高效检索。
/filters:no_upscale()/news/2026/05/netflix-druid-interval-cache/en/resources/1netflixapachedruid-1777092444864.jpeg)
查询流架构(图片来源:Netflix博客文章)
采用这种设计后,只有最近的时间区间需要重新计算,而历史片段则可以在多个相互重叠的查询之间复用。因此,到达 Druid 的查询所覆盖的时间范围被显著缩小,扫描的 segment 更少,处理的数据量也更低。在某些工作负载中,Netflix 观察到结果字节数最多可减少 14 倍,segment 扫描量也大幅下降。
该系统目前仅作为实验性层进行了部署,并且仍在持续演进。未来的工作包括将支持扩展到仪表盘工具使用的模板化 SQL 查询,以减少对 Druid 原生查询表达式的依赖。Netflix 也在探索把区间感知缓存更紧密地直接集成进 Apache Druid,从而消除对外部代理层的需求,并提升查询规划的效率。
查看英文原文:Netflix Serves 84% of Query Results from Cache with Interval-Aware Caching in Apache Druid





