🔥 面试必备

ES搜索系统热点流量高可用

当突发热点新闻时,搜索系统如何扛住流量洪峰,保障服务可用性? 本文将从问题分析、架构设计、防护策略等多个维度深入剖析

问题场景分析

🔥 突发热点事件

某明星官宣恋情、重大体育赛事夺冠、突发社会事件... 这类话题在社交网络上爆炸式传播,瞬间引发海量用户同时搜索

平时
轻微
一般
热点
爆炸
恢复
正常 QPS 1,000
热点时 QPS 150,000+
ES集群容量 50,000 QPS
缺口 ⚠️ 100,000 QPS

会面临的核心问题

💥

流量洪峰

QPS从千级暴涨到十万级,ES集群不堪重负

响应超时

查询堆积、超时、连接池耗尽,服务雪崩

😵

服务雪崩

一个热点拖垮整个搜索服务

📉

可用性下降

用户搜不到、打不开,服务不可用

高可用防护架构

👤 用户请求
发起搜索
🛡️ API网关
鉴权+限流
热点检测
识别热点词
📦 热点缓存
Redis+L1
🔄 异步队列
削峰填谷
🔍 ES集群
搜索服务
返回结果
响应用户

核心防护策略

🚦

限流熔断

流量控制

在网关层对进入的请求进行流量控制,当系统负载超过阈值时, 拒绝部分请求,防止压垮下游服务。

# Nginx 限流配置 limit_req_zone $binary_remote_addr zone=hot_topic:10m rate=100r/s; server { limit_req zone=hot_topic burst=200 nodelay; }
📉

服务降级

兜底策略

当ES压力过大时,返回预设的兜底数据: 热门话题返回缓存结果,非实时性内容展示静态页面。

async def search(query): try: result = await es.search(query) return result except ESTimeoutError: # 降级:返回热点缓存 return get_hot_topic_cache(query)
📦

多级缓存

热点缓存

L1本地缓存 + L2 Redis分布式缓存, 热点数据预加载到离用户更近的缓存层,减少ES压力。

// 多级缓存查询 function query(key) { // L1: 本地缓存 (Guava/Caffeine) let result = l1Cache.get(key); if (result) return result; // L2: Redis集群 result = redis.get(key); if (result) { l1Cache.set(key, result); return result; } // 回源ES return es.query(key); }
🔍

热点词识别

实时检测

通过滑动窗口统计搜索词频率, 识别突发热点词,对其走独立的热点处理通道。

# 热点词识别算法 热点词 = 窗口内词频 > 阈值 AND 词频增长率 > 斜率阈值 # 滑动窗口统计 SlidingWindowRateLimiter: - 窗口大小: 60秒 - 阈值: 10,000次/分钟 - 增长率: > 200%/分钟
🔄

异步削峰

队列缓冲

将非实时性请求放入消息队列, 削峰填谷,平滑处理突发流量,保护后端服务。

# Kafka 削峰配置 # 搜索请求写入队列 producer.send(search_request, topic='search-queue', partition='hot-topic') # 消费者平滑消费 consumer: max.poll.records: 500 max.poll.interval.ms: 300000
📈

弹性伸缩

云原生

K8s HPA根据CPU/内存自动扩缩容, ES集群冷热分离,热数据用高配节点,冷数据用低成本节点。

# K8s HPA 配置 apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec: metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 minReplicas: 3 maxReplicas: 50

策略对比一览

策略 作用位置 响应速度 资源消耗 适用场景
限流熔断 网关层 即时 极低 所有流量
服务降级 应用层 即时 ES过载时
多级缓存 全链路 极快 中等 热点数据
热点识别 网关层 快速 突发热点
异步削峰 队列层 延迟 非实时场景
弹性扩容 基础设施 较慢(分钟级) 持续高负载

交互式演示

ES集群状态 健康
缓存命中率 0%
当前 QPS 0
系统运行正常

核心要点总结

01

流量控制是底线

限流熔断是保障系统不被压垮的最后防线。 不要迷信"高性能",没有限流的系统在高并发面前不堪一击。

02

缓存是性能关键

热点数据走缓存,减少回源。 多级缓存+Lua脚本原子操作,让99%的热点请求根本碰不到ES。

03

降级是兜底策略

永远准备Plan B。当所有手段都失效时, 降级到静态页面、热词缓存,保证服务"有返回"。

04

弹性伸缩是长期方案

结合K8s HPA和ES集群的冷热分离, 在流量高峰前预热,在低峰期缩容降本。