面试题答案
一键面试技术选型
- 缓存数据库:选用 Redis 作为缓存数据库。Redis 具备高性能、支持多种数据结构(如哈希表适合存储交易相关数据)、丰富的原子操作指令(有助于保证数据一致性),并且支持主从复制和集群模式,可提升可用性。
- 分布式协调服务:使用 ZooKeeper。它能用于分布式环境下的配置管理、服务发现与注册,在缓存预热及应对极端情况时发挥重要作用,例如监控缓存节点状态、协调预热过程中的数据同步等。
架构设计
- 分层缓存架构
- 一级缓存:在应用服务器本地部署缓存(如 Ehcache),用于存储高频访问且对实时性要求稍低的数据。它能快速响应部分交易查询请求,减轻后端 Redis 缓存压力。
- 二级缓存:采用 Redis 集群作为主要缓存层,存储关键交易数据。Redis 集群通过分片机制,将数据分布在多个节点上,提升整体缓存容量和读写性能,以应对每秒数万笔交易请求。
- 缓存预热流程
- 数据来源:从数据库中批量读取近期高频交易相关数据,这些数据可根据交易类型、客户等维度进行分类。
- 预热策略:
- 定时预热:在系统业务低峰期,例如凌晨时段,通过定时任务从数据库读取数据并加载到 Redis 缓存中。利用 Redis 的管道(Pipeline)技术,批量执行写操作,减少网络开销,提高预热效率。
- 按需预热:当系统启动或缓存中某些数据缺失时,根据实时交易请求,从数据库加载数据并写入缓存。同时记录这些热点数据,为后续定时预热提供参考。
- 数据同步:利用 ZooKeeper 维护缓存数据版本号。当数据库中的交易数据发生变化时,通过消息队列(如 Kafka)通知相关服务,服务更新 Redis 缓存后,在 ZooKeeper 中更新版本号。其他服务在读取缓存数据时,先对比版本号,若不一致则重新从缓存加载数据,保证数据一致性。
应急处理机制
- 网络故障
- 重试机制:当应用与 Redis 缓存之间出现网络故障时,应用程序设置合理的重试次数和重试间隔。例如,首次失败后等待 100ms 重试,每次重试间隔翻倍,最多重试 3 次。若重试仍失败,则记录日志并返回友好的错误提示给前端。
- 备用链路:建立备用网络链路,如使用多网卡绑定技术或不同运营商网络,当主网络链路出现故障时,自动切换到备用链路,确保应用与缓存之间的通信畅通。
- 缓存雪崩
- 设置不同过期时间:在缓存预热时,为不同数据设置随机的过期时间,避免大量数据在同一时间过期,分散过期压力。例如,将过期时间设置在 1 - 2 小时内的随机值。
- 多级缓存兜底:当 Redis 缓存出现雪崩,一级缓存(如 Ehcache)仍可提供部分数据支持,保证部分交易查询能正常响应。同时,启动应急预热机制,优先从数据库加载热点数据到 Redis 缓存,逐步恢复缓存服务。
- 熔断与降级:当缓存雪崩导致系统负载过高时,启用熔断机制,暂时切断部分非关键业务的缓存访问,优先保障核心交易业务。对于非关键业务,进行降级处理,如返回默认数据或简单提示信息,以保证系统整体可用性。