1) 【一句话结论】:针对港口吞吐量高峰期的高并发,通过“突发流量动态限流(令牌桶+阈值调整)+缓存防雪崩(随机TTL)+负载均衡+数据库冷热分离分库分表”四层策略,确保系统稳定运行。
2) 【原理/概念讲解】:
- 突发流量限流(令牌桶算法):允许一定突发流量,通过动态调整令牌生成速率应对流量波动。类比“可调节的漏桶”,桶内令牌按固定速率生成,请求消耗令牌,当桶满时新请求等待,避免系统过载。
- 缓存防雪崩(随机TTL):避免大量缓存key同时过期,引发请求集中到数据库。为每个缓存key设置随机过期时间(如±50%的偏移),分散过期时间。
- 数据库冷热分离分库分表:按城市分库(如城市1对应库1),按时间分表(如按月拆分表),将近期高频访问的“热数据”放在热表(主库),冷数据放在冷表(从库或独立冷库),减少热点表压力。
3) 【对比与适用场景】:
-
限流算法对比:
| 算法 | 定义 | 特性 | 使用场景 | 注意点 |
| --- | --- | --- | --- | --- |
| 令牌桶 | 按固定速率生成令牌,请求消耗令牌 | 允许突发流量,速率可调 | 需应对突发流量(如双11) | 需动态调整令牌生成速率 |
| 漏桶 | 按固定速率流出请求 | 严格限制最大请求速率 | 需严格控制速率(如API调用) | 可能导致请求积压 |
-
缓存策略对比:
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
| --- | --- | --- | --- | --- |
| 随机TTL | 为key设置随机过期时间 | 分散过期时间,防雪崩 | 高并发场景(如双11) | 需合理设置随机范围 |
| LRU | 淘汰最近最少使用的数据 | 优先淘汰冷数据 | 高频读低频写 | 实现复杂,可能缓存雪崩 |
4) 【示例】:
用户请求“港口物流经理”岗位信息,流程如下:
- 限流:令牌桶检测到请求,生成令牌(每秒100令牌),若令牌不足则返回429错误;
- 缓存检查:Redis中查询key为“job:港口物流经理”,若命中(随机TTL=3600±1800秒),直接返回数据;
- 数据库查询:未命中则查询MySQL从库(按城市分库,城市1对应库1,按月分表),若数据不存在则缓存空值(TTL=30秒);
- 数据库写入:若需新增数据,主库写,从库同步,并更新Redis(TTL=1小时)。
5) 【面试口播版答案】:面试官您好,针对港口吞吐量高峰期的高并发,我会从四个层面设计方案:首先,突发流量控制,采用令牌桶算法结合动态阈值调整,实时监控流量,当检测到突发时降低令牌生成速率(如从每秒100令牌降至50令牌),避免系统过载;其次,缓存优化,为Redis缓存设置随机TTL(如±50%的偏移),避免大量key同时过期,同时缓存空值(短TTL)防穿透;然后,负载均衡,部署Nginx分发请求到多台服务器,轮询或加权轮询;最后,数据库优化,采用读写分离,主库写,从库读,按城市分库,按时间分表(如按月),并实施冷热数据分离,将近期高频访问的数据放在热表,冷数据放在冷表,减少热点表压力。通过这些措施,确保系统在高并发下稳定运行。
6) 【追问清单】:
- 问:如何动态调整令牌桶的速率?回答要点:通过监控系统(如Prometheus)实时采集流量数据,当流量超过阈值时,动态降低令牌生成速率(如从每秒100令牌降至50令牌)。
- 问:随机TTL具体怎么实现?回答要点:在Redis中为每个缓存key设置不同的过期时间(如TTL=3600±1800秒),避免大量key同时过期。
- 问:冷热数据分离后,如何处理冷数据的访问?回答要点:冷数据存储在独立冷库(如S3或二级数据库),访问时通过缓存穿透或预加载机制,减少对主库压力。
- 问:缓存服务故障时,系统如何降级?回答要点:启用缓存降级策略,直接查询数据库(主库或从库),保证核心功能可用。
- 问:数据库分库分表后,如何保证数据一致性?回答要点:通过分布式事务(如两阶段提交)或消息队列(如Kafka)异步更新,允许短时间数据不一致(如1秒内)。
7) 【常见坑/雷区】:
- 忽略突发流量动态调整,导致限流策略僵化,无法应对真实流量变化。
- 缓存雪崩未用随机TTL,导致大量请求直接打到数据库,引发雪崩。
- 分库分表按时间分表时,未考虑热点表问题,近期数据访问集中,性能下降。
- 限流算法选择错误,如用漏桶导致请求积压,影响用户体验。
- 缺少缓存故障容错机制,缓存服务宕机时系统直接崩溃。