MST

星途 面试题库

面试题:缓存设计之专家难度:复杂业务场景下缓存与消息队列的深度融合优化

设想一个复杂的社交网络系统,用户发布动态、点赞、评论等操作频繁。同时存在多种类型的数据需要缓存,如用户资料、动态内容、关系链等。并且消息队列用于异步处理诸如通知推送、数据统计等任务。请设计一套全面的缓存与消息队列协同方案,包括缓存架构选型、消息队列的拓扑结构设计、两者之间的交互机制,以及如何应对缓存雪崩、消息丢失等极端情况,以保障系统的高性能、高可用和数据完整性。
45.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存架构选型

  1. Redis
    • 优势:支持多种数据结构,如字符串、哈希表、列表、集合等,能满足不同类型数据缓存需求。读写性能极高,适合高并发场景。具备持久化机制(RDB 和 AOF),可在重启后恢复数据。支持集群模式,可通过增加节点提高存储容量和读写性能。
    • 应用场景:用户资料可存储为哈希表结构,动态内容以字符串或序列化对象形式存储,关系链可采用集合等结构。

消息队列拓扑结构设计

  1. Kafka
    • 生产者 - 主题 - 消费者模型
      • 生产者:将通知推送、数据统计等任务相关消息发送到特定主题。例如,用户点赞后,生产者将点赞统计相关消息发送到 “点赞统计” 主题。
      • 主题:按业务类型划分,如 “通知推送” 主题、“数据统计” 主题等。每个主题可进一步划分为多个分区,提高并行处理能力。
      • 消费者:多个消费者可组成消费者组,共同消费主题中的消息。例如,不同的消费者实例分别负责处理通知推送和数据统计任务,消费者组确保每条消息只被消费一次。
    • 优势:高吞吐量,能处理大量消息。可扩展性强,通过增加分区和副本提高性能和可用性。消息持久化存储,保证消息不丢失。

两者之间的交互机制

  1. 缓存更新触发消息队列
    • 当用户发布新动态、点赞或评论等操作发生时,除了更新缓存中的相关数据,同时向消息队列发送消息。例如,用户发布新动态,在更新动态内容缓存后,向 “通知推送” 主题发送通知消息,告知关注该用户的其他用户有新动态。
  2. 消息队列处理结果更新缓存
    • 消息队列中的任务处理完成后,根据处理结果更新缓存。如数据统计任务完成后,将统计结果更新到缓存中,以便快速展示给用户。

应对缓存雪崩

  1. 设置不同过期时间
    • 对缓存中的数据设置不同的过期时间,避免大量数据在同一时间过期。例如,用户资料缓存设置较长过期时间,动态内容缓存设置较短过期时间,且过期时间在一定范围内随机分布。
  2. 使用二级缓存
    • 一级缓存使用 Redis,二级缓存可采用本地缓存(如 Guava Cache)。当一级缓存失效时,先从二级缓存获取数据,同时后台线程重新加载数据到一级缓存。
  3. 缓存预热
    • 在系统启动时,预先加载部分热点数据到缓存中,避免系统刚启动时大量请求穿透到数据库。

应对消息丢失

  1. 消息确认机制
    • 生产者:采用同步发送消息方式,并开启消息确认机制。生产者发送消息后,等待 Kafka 确认消息已成功接收。若未收到确认,进行重试。
    • 消费者:在处理完消息后,向 Kafka 发送确认消息。Kafka 只有在收到消费者的确认后,才认为该消息已被成功消费。
  2. 持久化和副本机制
    • Kafka 的消息是持久化存储在磁盘上的,且每个分区可配置多个副本。当某个副本所在节点出现故障时,其他副本可继续提供服务,确保消息不丢失。
  3. 死信队列
    • 对于多次重试仍失败的消息,发送到死信队列。后续可对死信队列中的消息进行分析和人工处理,找出失败原因并解决问题。