面试题答案
一键面试消息中间件选型
- Kafka:
- 高吞吐量:Kafka 能够处理大量的消息,适合应对缓存雪崩时可能产生的高并发请求写入消息队列。
- 分布式架构:具备良好的扩展性,可以根据实际流量动态增加节点。
- 持久化存储:消息会持久化到磁盘,保证消息不会丢失,这对于缓存重建所需数据的可靠传输很重要。
- RabbitMQ:
- 可靠性高:支持事务、确认机制等,能确保消息的可靠传递,适用于对数据一致性要求较高的场景。
- 灵活的路由策略:可以根据不同的需求进行灵活的消息路由,方便对缓存重建相关消息进行分类处理。
消息处理逻辑
- 请求拦截与消息发送:
- 当缓存雪崩发生,应用程序接收到请求发现缓存缺失时,先将请求相关的信息(如请求的 key,可能还包含一些关联数据等)封装成消息发送到消息中间件。例如,如果是查询用户信息缓存缺失,将用户 ID 等相关信息作为消息内容发送。
- 可以在应用程序的拦截器或过滤器中实现这一逻辑,确保所有缓存缺失的请求都能被拦截并发送消息。
- 消息消费与缓存重建:
- 消息中间件的消费者从队列中获取消息。
- 消费者根据消息中的内容,查询数据库等数据源获取真实数据。例如,根据用户 ID 从用户表中查询用户信息。
- 使用获取到的数据重建缓存,将数据重新写入缓存系统,比如将用户信息写入 Redis 缓存。
缓存重建策略
- 异步重建:通过消息中间件异步处理缓存重建,避免大量请求直接查询数据库导致数据库压力过大。消息中间件的消费者在后台持续消费消息进行缓存重建,应用程序在发送消息后可以先返回一个默认值或者提示信息给用户,告知数据正在加载。
- 批量重建:
- 消费者可以采用批量处理的方式,一次从队列中获取多个消息,批量查询数据库和重建缓存。例如,一次获取 10 个用户 ID,批量查询数据库中这 10 个用户的信息,然后批量写入缓存。
- 这样可以减少数据库的查询次数,提高缓存重建的效率,降低数据库的压力。
- 过期时间错开:在重建缓存时,为每个缓存数据设置不同的过期时间,避免再次出现缓存雪崩。可以使用随机数或者根据一定规则(如按请求时间、请求的 key 的哈希值等)设置过期时间,使得缓存过期时间分布更均匀。