面试题答案
一键面试架构设计
- 数据分区:采用一致性哈希算法将商品库存数据分布到不同的节点上,减少数据迁移对一致性的影响,同时提高系统的可扩展性与可用性。当有新节点加入或旧节点故障时,仅部分数据受影响。
- 主从复制:设置主节点负责写操作,从节点负责读操作。主节点将写操作日志同步到从节点,以保证数据一致性。通过增加从节点数量可提升读性能,同时主从切换机制保证系统高可用。例如,使用 MySQL 的主从复制。
- 分布式事务:对于涉及库存修改等跨节点操作,采用两阶段提交(2PC)或三阶段提交(3PC)协议保证一致性,但因其性能开销,在非关键场景可采用最终一致性方案。如引入消息队列,先扣减本地库存,再通过消息异步同步到其他节点,一定时间内达到最终一致。
算法选择
- 乐观锁与悲观锁:读多写少场景采用乐观锁,仅在更新时检查数据是否被修改,提升并发性能,但可能导致更新失败需重试。写多读少场景采用悲观锁,提前锁定数据,保证一致性,但并发性能较低。例如,使用版本号实现乐观锁,数据库行锁实现悲观锁。
- 缓存更新算法:采用 LRU(最近最少使用)算法管理缓存,在缓存满时淘汰最近最少使用的数据,保证热点数据在缓存中,提升缓存命中率与性能。同时,在更新库存数据时,采用合适策略更新缓存,如先更新数据库再删除缓存,防止缓存脏数据。
缓存策略
- 多级缓存:采用本地缓存(如 Guava Cache)和分布式缓存(如 Redis)结合。本地缓存处理高并发读请求,减少对分布式缓存的压力,提升性能。分布式缓存存储共享数据,保证数据一致性。如商品库存基础信息存于分布式缓存,用户近期浏览商品库存的临时数据存于本地缓存。
- 缓存读写策略:读操作先从缓存获取数据,命中则直接返回,未命中再从数据库读取并更新缓存。写操作采用写后更新缓存策略,先更新数据库,成功后再更新缓存。同时设置缓存过期时间,保证数据的一致性与时效性。例如,对热门商品设置较短过期时间,定期从数据库刷新数据到缓存。
优化策略和方案
- 异步处理:将一些非关键的库存更新操作放入消息队列异步处理,如库存变更记录写入日志。减少同步操作对系统性能的影响,提高系统响应速度与可用性。
- 限流与熔断:设置限流策略,如令牌桶算法,限制每秒对库存系统的请求数,防止高并发流量压垮系统。同时引入熔断机制,当某个服务出现故障或响应时间过长时,快速返回错误,防止故障扩散,保证系统整体可用性。
- 数据预取与预热:提前预取热门商品库存数据到缓存中,在系统启动或流量低谷期进行缓存预热,避免高并发时缓存击穿问题,提升系统性能与可用性。