面试题答案
一键面试技术手段和策略
- 分布式锁:
- 应用场景:在处理订单时,使用分布式锁确保同一商品库存的修改不会冲突。例如,当多个用户同时抢购同一款限量商品时,通过分布式锁保证只有一个事务能成功修改库存。
- 实现方式:可以基于Redis实现分布式锁。Redis的SETNX(SET if Not eXists)命令能原子性地设置一个键值对,若键不存在则设置成功返回1,若键已存在则返回0。通过这种方式,第一个获取到锁的事务可以执行库存修改等操作,其他事务等待锁释放。
- 分布式事务协议:
- 两阶段提交(2PC):
- 应用方式:在订单处理中,第一阶段(准备阶段),协调者向所有参与者(如订单服务、库存服务、支付服务等涉及事务的服务)发送Prepare请求,参与者检查自身资源是否满足事务要求,并返回Yes或No。若所有参与者都返回Yes,进入第二阶段(提交阶段),协调者向所有参与者发送Commit请求,参与者执行事务提交;若有任何一个参与者返回No,协调者发送Abort请求,参与者回滚事务。
- 优缺点:优点是简单直观,能保证强一致性。缺点是单点故障问题(协调者故障可能导致事务无法完成),且性能较低,因为整个过程中参与者资源被锁定等待协调者指令。
- 三阶段提交(3PC):
- 应用方式:在2PC基础上增加了一个预提交阶段。第一阶段(CanCommit阶段),协调者询问参与者是否可以进行事务操作,参与者回复自身状态。第二阶段(PreCommit阶段),若所有参与者都回复可以操作,协调者向参与者发送PreCommit请求,参与者执行事务操作,但不提交,此时处于一种“预提交”状态。第三阶段(DoCommit阶段),协调者根据参与者在PreCommit阶段的反馈,若都正常则发送Commit请求,参与者提交事务;若有异常则发送Abort请求,参与者回滚事务。
- 优缺点:相比2PC,3PC降低了单点故障的影响,因为即使协调者在PreCommit阶段后故障,参与者可以根据自身状态决定后续操作。但3PC增加了额外的交互阶段,网络开销更大。
- Paxos:
- 应用方式:Paxos主要用于解决分布式系统中的一致性问题。在电商交易系统中,对于关键数据(如订单状态、库存数量等)的更新,可以使用Paxos算法来确保所有副本数据的一致性。例如,当一个订单状态发生变化时,通过Paxos算法让所有副本达成一致,保证各个节点上的数据相同。
- 优缺点:优点是能在非拜占庭故障情况下保证一致性,容错性强。缺点是实现复杂,算法理解和工程实现难度较大。
- 两阶段提交(2PC):
- 数据一致性和系统性能的权衡:
- 强一致性与最终一致性:
- 强一致性:在订单处理等关键场景下,采用强一致性策略,如使用2PC协议确保订单状态、库存、支付等数据的一致性。这能保证用户在操作后立即看到准确的结果,但可能影响系统性能,因为事务处理过程中资源被锁定。
- 最终一致性:对于一些非关键数据,如用户浏览记录、商品评价统计等,可以采用最终一致性。使用异步消息队列(如Kafka)来处理这些数据更新,系统性能更高,但数据可能存在短暂的不一致情况。例如,用户提交商品评价后,评价统计数据可能会稍有延迟更新。
- 读写分离与缓存策略:
- 读写分离:将数据库的读操作和写操作分离,使用主从复制架构。主库处理写操作,从库处理读操作。在订单处理中,写操作(如创建订单、更新库存等)在主库执行,读操作(如查询订单状态)可以从多个从库获取数据,提高系统的并发读性能。
- 缓存策略:使用缓存(如Redis)来减轻数据库压力。对于频繁读取且不经常变化的数据(如商品基本信息、热门商品销量等),可以缓存到Redis中。当有读请求时,先从缓存读取,若缓存未命中再从数据库读取并更新缓存。在订单处理中,商品的基本信息可以缓存,提高订单创建时读取商品信息的速度。但要注意缓存与数据库数据的一致性问题,当数据发生变化时,需要及时更新缓存。
- 分区与分片:
- 分区:按业务功能对数据库进行分区,如订单数据库、库存数据库、用户数据库等。在订单处理事务中,不同的业务功能对应不同的数据库分区,减少单个数据库的压力,提高系统的可扩展性。
- 分片:对于数据量较大的表(如订单表),采用分片策略。可以按订单ID的哈希值或时间等维度进行分片,将数据分布在多个数据库节点上。这样可以提高数据的读写性能,当处理大量订单时,不同的订单操作可以并行在不同的分片上执行,提升系统整体性能。
- 强一致性与最终一致性: