🔥 面试必备

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集群的冷热分离, 在流量高峰前预热,在低峰期缩容降本。