面试题答案
一键面试缓存架构选型
- Redis:
- 优势:支持多种数据结构,如字符串、哈希表、列表、集合等,能满足不同类型数据缓存需求。读写性能极高,适合高并发场景。具备持久化机制(RDB 和 AOF),可在重启后恢复数据。支持集群模式,可通过增加节点提高存储容量和读写性能。
- 应用场景:用户资料可存储为哈希表结构,动态内容以字符串或序列化对象形式存储,关系链可采用集合等结构。
消息队列拓扑结构设计
- Kafka:
- 生产者 - 主题 - 消费者模型:
- 生产者:将通知推送、数据统计等任务相关消息发送到特定主题。例如,用户点赞后,生产者将点赞统计相关消息发送到 “点赞统计” 主题。
- 主题:按业务类型划分,如 “通知推送” 主题、“数据统计” 主题等。每个主题可进一步划分为多个分区,提高并行处理能力。
- 消费者:多个消费者可组成消费者组,共同消费主题中的消息。例如,不同的消费者实例分别负责处理通知推送和数据统计任务,消费者组确保每条消息只被消费一次。
- 优势:高吞吐量,能处理大量消息。可扩展性强,通过增加分区和副本提高性能和可用性。消息持久化存储,保证消息不丢失。
- 生产者 - 主题 - 消费者模型:
两者之间的交互机制
- 缓存更新触发消息队列:
- 当用户发布新动态、点赞或评论等操作发生时,除了更新缓存中的相关数据,同时向消息队列发送消息。例如,用户发布新动态,在更新动态内容缓存后,向 “通知推送” 主题发送通知消息,告知关注该用户的其他用户有新动态。
- 消息队列处理结果更新缓存:
- 消息队列中的任务处理完成后,根据处理结果更新缓存。如数据统计任务完成后,将统计结果更新到缓存中,以便快速展示给用户。
应对缓存雪崩
- 设置不同过期时间:
- 对缓存中的数据设置不同的过期时间,避免大量数据在同一时间过期。例如,用户资料缓存设置较长过期时间,动态内容缓存设置较短过期时间,且过期时间在一定范围内随机分布。
- 使用二级缓存:
- 一级缓存使用 Redis,二级缓存可采用本地缓存(如 Guava Cache)。当一级缓存失效时,先从二级缓存获取数据,同时后台线程重新加载数据到一级缓存。
- 缓存预热:
- 在系统启动时,预先加载部分热点数据到缓存中,避免系统刚启动时大量请求穿透到数据库。
应对消息丢失
- 消息确认机制:
- 生产者:采用同步发送消息方式,并开启消息确认机制。生产者发送消息后,等待 Kafka 确认消息已成功接收。若未收到确认,进行重试。
- 消费者:在处理完消息后,向 Kafka 发送确认消息。Kafka 只有在收到消费者的确认后,才认为该消息已被成功消费。
- 持久化和副本机制:
- Kafka 的消息是持久化存储在磁盘上的,且每个分区可配置多个副本。当某个副本所在节点出现故障时,其他副本可继续提供服务,确保消息不丢失。
- 死信队列:
- 对于多次重试仍失败的消息,发送到死信队列。后续可对死信队列中的消息进行分析和人工处理,找出失败原因并解决问题。