知识卡片
为高频、集中的访问模式单独构建缓存层:Cloud Query池的设计
内容
百姓网观察到自己业务一个非常明显的访问特征:第1到3页的查询请求占了所有访问量的80%以上——绝大多数用户只会浏览搜索结果的前几页,很少有人会深入翻到后面的页码。针对这个高度集中的访问分布,团队专门为这部分查询构建了一个独立的Cloud Query池(也叫Cached Query),核心设计包括:查询方式沿用和Elasticsearch相同的DSL语法(降低业务方切换的学习和适配成本);池里的数据初始时从Elasticsearch获取;只保留几百条左右的新鲜数据、并持续更新,不追求覆盖全量数据;一旦这个池里的数据不足以满足查询需求,会自动回退到直接查询Elasticsearch;底层用Redis zset(部署在Redis Cluster上)来实际存储这些新鲜数据。为了实现这个代理层,团队专门用Golang开发了一个名为4Sea的Proxy服务。这个设计给出了一条应对”访问高度集中在某个局部区域”这类流量特征的典型思路:当分析访问日志发现绝大多数真实请求其实只集中命中数据的一小部分(这里是搜索结果的前几页),就值得为这一小部分数据单独构建一层更轻量、响应更快的缓存,把原本需要重复经过完整查询引擎(Elasticsearch)处理的高频请求拦截在缓存层,只有缓存层数据不足时才真正下沉到完整的查询引擎——这个思路本质上是”二八法则”在缓存架构设计上的具体应用:先精确识别出真正贡献大部分流量的那一小部分数据范围,再针对这个范围单独优化,而不是对所有数据一视同仁地走同一套(相对更重)的查询路径。
参考来源
- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.3 百姓网Elasticsearch2.x升级之路"节,"6.3.4 百姓之道"(源文件:_epub-src/OEBPS/Text/Chapter6_3_5.xhtml)
- 结论依据:原文说明"我们的一个特点是第1~3页几乎是所有访问的80%以上,所以对这部分查询我们构造了一个Cloud Query池,用于提供快速访问……使用DSL查询……保留了几百个左右新鲜数据……数据不足,查询指向Elasticsearh……使用Redis zset存储新鲜数据……我们使用Golang语言开发一个Proxy类型的服务(代号4Sea)",直接支撑本卡片结论。
- 原始内容:我们的一个特点是第1~3页几乎是所有访问的80%以上,所以对这部分查询我们构造了一个Cloud Query池,用于提供快速访问……为实现上面的功能,我们使用Golang语言开发一个Proxy类型的服务(代号4Sea)。