MST

星途 面试题库

面试题:在大规模分布式系统中,如何权衡数据一致性与系统可用性、性能之间的关系并给出优化策略

在一个大规模的分布式电商系统中,既要保证商品库存数据的一致性,又要确保系统高可用和高性能。面对高并发读写场景,阐述你如何从架构设计、算法选择、缓存策略等多方面权衡一致性、可用性和性能这三者的关系,并给出具体的优化策略和方案。
35.3万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

架构设计

  1. 数据分区:采用一致性哈希算法将商品库存数据分布到不同的节点上,减少数据迁移对一致性的影响,同时提高系统的可扩展性与可用性。当有新节点加入或旧节点故障时,仅部分数据受影响。
  2. 主从复制:设置主节点负责写操作,从节点负责读操作。主节点将写操作日志同步到从节点,以保证数据一致性。通过增加从节点数量可提升读性能,同时主从切换机制保证系统高可用。例如,使用 MySQL 的主从复制。
  3. 分布式事务:对于涉及库存修改等跨节点操作,采用两阶段提交(2PC)或三阶段提交(3PC)协议保证一致性,但因其性能开销,在非关键场景可采用最终一致性方案。如引入消息队列,先扣减本地库存,再通过消息异步同步到其他节点,一定时间内达到最终一致。

算法选择

  1. 乐观锁与悲观锁:读多写少场景采用乐观锁,仅在更新时检查数据是否被修改,提升并发性能,但可能导致更新失败需重试。写多读少场景采用悲观锁,提前锁定数据,保证一致性,但并发性能较低。例如,使用版本号实现乐观锁,数据库行锁实现悲观锁。
  2. 缓存更新算法:采用 LRU(最近最少使用)算法管理缓存,在缓存满时淘汰最近最少使用的数据,保证热点数据在缓存中,提升缓存命中率与性能。同时,在更新库存数据时,采用合适策略更新缓存,如先更新数据库再删除缓存,防止缓存脏数据。

缓存策略

  1. 多级缓存:采用本地缓存(如 Guava Cache)和分布式缓存(如 Redis)结合。本地缓存处理高并发读请求,减少对分布式缓存的压力,提升性能。分布式缓存存储共享数据,保证数据一致性。如商品库存基础信息存于分布式缓存,用户近期浏览商品库存的临时数据存于本地缓存。
  2. 缓存读写策略:读操作先从缓存获取数据,命中则直接返回,未命中再从数据库读取并更新缓存。写操作采用写后更新缓存策略,先更新数据库,成功后再更新缓存。同时设置缓存过期时间,保证数据的一致性与时效性。例如,对热门商品设置较短过期时间,定期从数据库刷新数据到缓存。

优化策略和方案

  1. 异步处理:将一些非关键的库存更新操作放入消息队列异步处理,如库存变更记录写入日志。减少同步操作对系统性能的影响,提高系统响应速度与可用性。
  2. 限流与熔断:设置限流策略,如令牌桶算法,限制每秒对库存系统的请求数,防止高并发流量压垮系统。同时引入熔断机制,当某个服务出现故障或响应时间过长时,快速返回错误,防止故障扩散,保证系统整体可用性。
  3. 数据预取与预热:提前预取热门商品库存数据到缓存中,在系统启动或流量低谷期进行缓存预热,避免高并发时缓存击穿问题,提升系统性能与可用性。