博客
关于我
oppo后端16连问
阅读量:794 次
发布时间:2023-02-24

本文共 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/

    你可能感兴趣的文章
    OpenCV安装
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    opencv实现多路播放
    查看>>
    opencv常用函数
    查看>>
    OpenCV探索
    查看>>
    OpenCV添加中文(五)
    查看>>
    OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
    查看>>
    opencv特征提取1-Harris角点检测
    查看>>
    OpenCV环境搭建(一)
    查看>>
    OpenCV的视频读取
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    OpenCV读写avi、mpeg文件
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>