MST

星途 面试题库

面试题:缓存设计之高级难度:缓存雪崩与消息中间件的应对策略

假设缓存系统出现缓存雪崩情况,大量缓存数据同时失效,此时如何借助消息中间件来平稳过渡,保证系统的可用性和数据的一致性?请详细说明消息中间件的选型、消息处理逻辑以及缓存重建的策略。
29.8万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

消息中间件选型

  1. Kafka
    • 高吞吐量:Kafka 能够处理大量的消息,适合应对缓存雪崩时可能产生的高并发请求写入消息队列。
    • 分布式架构:具备良好的扩展性,可以根据实际流量动态增加节点。
    • 持久化存储:消息会持久化到磁盘,保证消息不会丢失,这对于缓存重建所需数据的可靠传输很重要。
  2. RabbitMQ
    • 可靠性高:支持事务、确认机制等,能确保消息的可靠传递,适用于对数据一致性要求较高的场景。
    • 灵活的路由策略:可以根据不同的需求进行灵活的消息路由,方便对缓存重建相关消息进行分类处理。

消息处理逻辑

  1. 请求拦截与消息发送
    • 当缓存雪崩发生,应用程序接收到请求发现缓存缺失时,先将请求相关的信息(如请求的 key,可能还包含一些关联数据等)封装成消息发送到消息中间件。例如,如果是查询用户信息缓存缺失,将用户 ID 等相关信息作为消息内容发送。
    • 可以在应用程序的拦截器或过滤器中实现这一逻辑,确保所有缓存缺失的请求都能被拦截并发送消息。
  2. 消息消费与缓存重建
    • 消息中间件的消费者从队列中获取消息。
    • 消费者根据消息中的内容,查询数据库等数据源获取真实数据。例如,根据用户 ID 从用户表中查询用户信息。
    • 使用获取到的数据重建缓存,将数据重新写入缓存系统,比如将用户信息写入 Redis 缓存。

缓存重建策略

  1. 异步重建:通过消息中间件异步处理缓存重建,避免大量请求直接查询数据库导致数据库压力过大。消息中间件的消费者在后台持续消费消息进行缓存重建,应用程序在发送消息后可以先返回一个默认值或者提示信息给用户,告知数据正在加载。
  2. 批量重建
    • 消费者可以采用批量处理的方式,一次从队列中获取多个消息,批量查询数据库和重建缓存。例如,一次获取 10 个用户 ID,批量查询数据库中这 10 个用户的信息,然后批量写入缓存。
    • 这样可以减少数据库的查询次数,提高缓存重建的效率,降低数据库的压力。
  3. 过期时间错开:在重建缓存时,为每个缓存数据设置不同的过期时间,避免再次出现缓存雪崩。可以使用随机数或者根据一定规则(如按请求时间、请求的 key 的哈希值等)设置过期时间,使得缓存过期时间分布更均匀。