MST

星途 面试题库

面试题:缓存设计之高级难度:高并发下缓存与消息队列的流量削峰和兜底策略

在高并发场景下,使用缓存和消息队列进行流量削峰。当缓存突然失效且消息队列积压严重时,你会如何设计兜底策略,以保证系统既不崩溃又能尽量保证数据的准确性和完整性?
32.8万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

1. 限流策略

  • 接口限流:对系统的入口接口采用限流算法,如令牌桶算法或漏桶算法。例如,使用Guava的RateLimiter实现令牌桶限流,限制每秒到达系统的请求数量,防止大量请求直接冲击后端服务,减轻消息队列和后端系统的压力。
  • 用户限流:根据用户标识进行限流,比如限制每个用户在一定时间内的请求次数。可以通过Redis的原子操作(如INCR和EXPIRE)实现,以保护系统不被单个用户的高并发请求拖垮。

2. 数据持久化与补偿机制

  • 请求日志记录:在请求进入系统时,无论缓存是否失效,都将请求数据持久化到可靠的存储中,如数据库或分布式文件系统。记录请求的关键信息,以便后续进行补偿处理。
  • 消息队列数据持久化:确保消息队列本身对消息进行持久化存储,避免因队列故障导致消息丢失。例如,Kafka通过将消息持久化到磁盘来保证数据的可靠性。
  • 补偿任务:启动一个后台任务,定期检查消息队列的积压情况和缓存失效期间的请求日志。对于未处理的请求,按照一定的策略重新发送到消息队列或直接处理,以保证数据的完整性。

3. 降级策略

  • 非核心功能降级:识别系统中的非核心功能,在缓存失效和队列积压严重时,暂时关闭这些功能,优先保证核心业务的正常运行。例如,某些统计报表生成、推荐系统等功能可以在紧急情况下降级。
  • 只读模式:对于一些允许读旧数据的业务场景,将系统切换到只读模式。此时,即使缓存失效,仍然可以从数据库等持久化存储中读取数据返回给用户,虽然数据可能不是最新的,但能保证系统的可用性。

4. 动态资源调整

  • 增加资源:监控系统的各项指标,如CPU、内存、网络等。当发现系统资源紧张时,自动触发资源扩容机制,如增加服务器节点、扩展消息队列的分区数等。云平台(如阿里云、AWS)通常提供自动伸缩(Auto Scaling)功能来实现这一点。
  • 优化资源利用:检查系统中是否存在资源浪费的情况,例如不合理的数据库查询、无效的缓存使用等。优化代码和配置,提高系统资源的利用率,以应对高并发压力。

5. 熔断机制

  • 设置熔断阈值:针对依赖的外部服务(如缓存服务),设置熔断阈值。当请求失败率或响应时间超过一定阈值时,触发熔断,暂时停止对该服务的请求,避免大量无效请求堆积。
  • 熔断恢复:在熔断后,每隔一段时间尝试恢复对缓存服务的请求,如采用逐步试探的方式,逐渐增加请求量,直到缓存服务恢复正常。