面试题答案
一键面试架构设计思路
- 分层架构:采用多层架构,将缓存层、业务逻辑层和时间序列数据库层分离,降低耦合度,便于独立扩展和维护。
- 负载均衡:在缓存层和数据库层前分别设置负载均衡器,将请求均匀分配到多个节点,避免单点故障,提高系统的扩展性和容错性。
- 多级缓存:使用多级缓存,如本地缓存(如 Guava Cache)和分布式缓存(如 Redis)相结合,减少对分布式缓存的压力,同时提高响应速度。
关键技术点
- 缓存雪崩处理
- 设置不同过期时间:为缓存数据设置随机的过期时间,避免大量缓存同时过期,导致缓存雪崩。
- 缓存预热:系统启动时,提前将部分热点数据加载到缓存中,避免初始化时大量请求直接打到数据库。
- 熔断与降级:当缓存服务出现故障时,使用熔断机制暂时切断对缓存的请求,直接访问数据库,并通过降级策略,如返回默认值或简单提示信息,保证系统的基本可用性。
- 缓存穿透处理
- 布隆过滤器:在缓存层之前添加布隆过滤器,快速判断请求的数据是否存在于数据库中。如果不存在,直接返回,避免无效请求穿透到数据库。
- 空值缓存:当请求的数据在数据库中不存在时,将空值也缓存起来,并设置较短的过期时间,防止后续相同的无效请求继续穿透。
- 扩展性
- 分布式缓存集群:使用 Redis Cluster 等分布式缓存集群方案,通过增加节点可以线性扩展缓存容量和处理能力。
- 数据库分片:对时间序列数据库采用分片技术,如按时间或业务维度进行分片,将数据分散存储在多个数据库节点上,提高数据库的扩展性。
- 容错性
- 缓存数据持久化:对 Redis 等分布式缓存采用 AOF 或 RDB 持久化策略,保证在缓存节点故障重启后,数据不会丢失。
- 数据库主从复制:时间序列数据库采用主从复制架构,主库负责写操作,从库负责读操作,并在主库出现故障时,通过自动故障转移机制,将从库提升为主库,保证数据库的可用性。
各组件交互流程
- 请求到达:客户端请求首先到达负载均衡器。
- 负载均衡到缓存层:负载均衡器将请求转发到分布式缓存集群中的某个节点。
- 缓存命中:如果缓存中存在请求的数据,直接返回给客户端。
- 缓存未命中:
- 布隆过滤器判断:请求经过布隆过滤器,若判断数据不存在,则直接返回,避免穿透到数据库。
- 查询数据库:若布隆过滤器判断数据可能存在,请求进入业务逻辑层,业务逻辑层从时间序列数据库中查询数据。
- 缓存数据:查询到数据后,业务逻辑层将数据写入缓存,并返回给客户端。若查询结果为空,同样将空值缓存起来。
- 缓存雪崩应对:当缓存出现大量过期或故障时,负载均衡器根据熔断策略,将部分请求直接转发到数据库,同时业务逻辑层通过降级策略返回相应信息,保证系统可用性。随着缓存逐渐恢复,系统逐渐恢复正常运行。