当突发热点新闻时,搜索系统如何扛住流量洪峰,保障服务可用性? 本文将从问题分析、架构设计、防护策略等多个维度深入剖析
某明星官宣恋情、重大体育赛事夺冠、突发社会事件... 这类话题在社交网络上爆炸式传播,瞬间引发海量用户同时搜索
QPS从千级暴涨到十万级,ES集群不堪重负
查询堆积、超时、连接池耗尽,服务雪崩
一个热点拖垮整个搜索服务
用户搜不到、打不开,服务不可用
在网关层对进入的请求进行流量控制,当系统负载超过阈值时, 拒绝部分请求,防止压垮下游服务。
limit_req_zone $binary_remote_addr
zone=hot_topic:10m rate=100r/s;
server {
limit_req zone=hot_topic burst=200
nodelay;
}
当ES压力过大时,返回预设的兜底数据: 热门话题返回缓存结果,非实时性内容展示静态页面。
L1本地缓存 + L2 Redis分布式缓存, 热点数据预加载到离用户更近的缓存层,减少ES压力。
通过滑动窗口统计搜索词频率, 识别突发热点词,对其走独立的热点处理通道。
热点词 = 窗口内词频 > 阈值
AND 词频增长率 > 斜率阈值
# 滑动窗口统计
SlidingWindowRateLimiter:
- 窗口大小: 60秒
- 阈值: 10,000次/分钟
- 增长率: > 200%/分钟
将非实时性请求放入消息队列, 削峰填谷,平滑处理突发流量,保护后端服务。
# 搜索请求写入队列
producer.send(search_request,
topic='search-queue',
partition='hot-topic')
# 消费者平滑消费
consumer:
max.poll.records: 500
max.poll.interval.ms: 300000
K8s HPA根据CPU/内存自动扩缩容, ES集群冷热分离,热数据用高配节点,冷数据用低成本节点。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
minReplicas: 3
maxReplicas: 50
| 策略 | 作用位置 | 响应速度 | 资源消耗 | 适用场景 |
|---|---|---|---|---|
| 限流熔断 | 网关层 | 即时 | 极低 | 所有流量 |
| 服务降级 | 应用层 | 即时 | 低 | ES过载时 |
| 多级缓存 | 全链路 | 极快 | 中等 | 热点数据 |
| 热点识别 | 网关层 | 快速 | 低 | 突发热点 |
| 异步削峰 | 队列层 | 延迟 | 低 | 非实时场景 |
| 弹性扩容 | 基础设施 | 较慢(分钟级) | 高 | 持续高负载 |
限流熔断是保障系统不被压垮的最后防线。 不要迷信"高性能",没有限流的系统在高并发面前不堪一击。
热点数据走缓存,减少回源。 多级缓存+Lua脚本原子操作,让99%的热点请求根本碰不到ES。
永远准备Plan B。当所有手段都失效时, 降级到静态页面、热词缓存,保证服务"有返回"。
结合K8s HPA和ES集群的冷热分离, 在流量高峰前预热,在低峰期缩容降本。