本文共 2350 字,大约阅读时间需要 7 分钟。
分布式系统与数据库优化
大家好,我是磊哥。最近有位读者去面试了OPPO,给大家整理了面试真题的答案。希望对大家有帮助哈,一起学习,一起进步。
1. 印象最深刻的项目与优化
在技术面试中,分享自己的项目经历是非常好的切入点。平时做的项目,如果涉及到缓存、数据库、分布式锁等技术点,可以条理清晰地写到简历去。比如在缓存穿透问题中,我们设置了一个-1到缓存,代表数据库没记录。下次判断-1时,就不再查询数据库,避免了穿透问题。
此外,如果你做了优化,比如对接口进行了并发处理或提升了性能,可以详细描述你的思路和方法。比如通过分批处理和异步调用优化了接口性能,这样的技术点往往会让面试官感兴趣。
2. 分布式锁的使用场景
在项目中提到分布式锁时,可以说明它是用来解决超卖问题的。比如在电商系统中,多个节点同时读取同一商品库存,分布式锁可以确保只能有一个节点修改库存,避免库存双重扣减。
此外,分布式锁可以用于保证缓存和数据库的一致性。比如在读写并发的情况下,分布式锁可以防止缓存服务器和数据库之间的数据不一致。
3. 分布式事务解决方案
分布式事务是指分布式系统中的事务管理,核心目标是保证数据一致性。CAP理论和BASE理论是分布式事务的基础。
常见分布式事务解决方案包括:
- 2PC(两阶段提交):有prepare和commit/rollback两个阶段,prepare阶段需要等待所有参与子事务的反馈,可能引起性能问题。
- TCC(Try、Confirm、Cancel):采用补偿机制,每个操作都有对应的确认和补偿操作。
- 本地消息表:通过本地消息表将分布式事务转化为本地事务。
- 最大努力通知:通过通知机制保证消息传递。
- Saga模式:由事务协调器协调多个本地事务,支持长事务。
4. 接口幂等性保证
接口幂等性是保证接口高可用性的重要措施。在接口超时时,可以通过重试机制来解决问题,但下游接口必须支持幂等性。
实现幂等性的方法包括:
- 唯一标识:通过唯一的主键或唯一索引确保插入时冲突。
- 状态机:用状态机管理接口的调用流程。
- 令牌:通过令牌机制确保每次调用唯一性。
- 分布式锁:确保接口的并发性。
5. MySQL架构
在实际项目中,MySQL的架构通常采用以下方式:
- 双机主备:一主一从,优点是简单高可用,但并发能力有限。
- 一主多从:一主多从,提升了并发能力,但主库的写压力大。
- MariaDB集群:通过Galera replication实现高可用和高并发,但大事务可能导致性能问题。
- 数据库中间件:如MyCat,通过分片和分表解决高并发和高可用问题。
6. 索引结构
索引结构根据查询需求不同有以下选择:
- 哈希表:适用于只有等值查询的场景。
- 有序数组:适合范围查询,但插入成本高。
- B+树:是常用的索引结构,支持范围查询。
- 联合索引:通过最左前缀原则最大化索引复用率。
7. 索引优化
对于字段ab、ac、abc,联合索引的最左前缀原则可以帮助我们选择最优索引。比如,直接建abc联合索引和ac联合索引即可覆盖所有查询需求。
8. 数据库隔离级别
数据库默认隔离级别是可重复读(RR),原因如下:
- RR隔离级别:通过MVCC机制避免了不可重复读和幻读问题。
- RC隔离级别:虽然支持更高的并发,但在大规模事务下容易出现数据不一致问题。
9. RR隔离级别实现原理
RR隔离级别通过MVCC和Read View机制解决不可重复读问题。具体流程如下:
Read View生成:每个事务生成一个Read View副本。 版本比较:在查询时,根据Read View副本判断数据版本是否可见。 版本链管理:通过Undo Log版本链确保数据一致性。
10. RocketMQ消息不丢失
RocketMQ保证消息不丢失的关键措施包括:
- 生产者保证:通过同步发送和重试机制确保消息到达。
- 存储端保证:通过异步刷盘和主从同步机制确保消息持久化。
- 消费者保证:通过ACK机制确保消息成功消费。
11. 事务消息与订单清空购物车
事务消息通过本地消息表解决数据一致性问题。具体流程如下:
生产者发送半事务消息到MQ。 MQ持久化消息并返回ACK。 生产者执行本地事务(如订单创建)。 根据本地事务结果,MQ更新消息状态为可发送或删除。
12. 判断奇偶数
判断一个数是奇数还是偶数的方法除了对2取余,还可以用与1操作:
- 奇数:x & 1 == 1
- 偶数:x & 1 == 0
13. Spring声明式事务失效场景
Spring声明式事务会失效的情形包括:
- 方法权限:必须为public。
- final方法:不能生成代理。
- 内部调用:同一类方法直接调用。
- 未管理的方法:未被Spring管理的方法无法获取事务支持。
- 多线程:不同线程的方法无法共享同一连接。
- 不支持事务的存储引擎:如MyISAM不支持事务。
14. 微服务架构设计
在设计淘宝系统时,可以按业务功能划分微服务:
- 核心服务:订单、支付、物流、用户。
- 服务化接口:商品、搜索、推荐。
- 数据服务:库存、用户信息、评价。
15. 分库分表与分布式ID
分库分表通常采用水平或垂直分法。水平分表通过hash取模或range分区,垂直分表按业务类型分库。
分布式ID可以使用雪花算法生成,确保全局唯一性。
16. 异常的共同祖先与运行时异常
所有异常的共同祖先是Throwable,其子类包括Error和Exception。运行时异常主要有:
- NullPointerException、ArithmeticException、IndexOutOfBoundsException等。
希望这篇文章对您有所帮助,或者有所启发的话,记得点赞、转发、在看,支持我创作更多高质量内容!
转载地址:http://sipfk.baihongyu.com/