• 你平时写代码时,如何保证代码可靠、可复用、可扩展、可维护?有总结经验吗,请举例说明。参考答案 by newBing:
    编写文档:编写文档是保证代码可维护性的重要手段。文档应该包括代码的设计思路、实现细节、使用方法等。
    遵循编码规范:编码规范是保证代码质量的重要手段。遵循编码规范可以使代码更加易读、易懂、易维护。
    使用设计模式:设计模式是一种被广泛应用于软件开发中的解决方案。使用设计模式可以使代码更加易扩展、易维护。
    进行代码重构:代码重构是指在不改变代码外部行为的前提下,对代码内部结构进行调整,以提高代码质量。通过代码重构可以使代码更加易读、易懂、易维护。
    进行单元测试:单元测试是指对软件中的最小可测试单元进行测试。通过单元测试可以发现代码中的错误,提高代码质量。
    使用版本控制工具:版本控制工具可以帮助我们管理代码的版本,方便团队协作和代码维护。

  • 如果你来制订公司的代码规范,你认为应该有哪些内容?参考答案:阿里巴巴Java开发手册

  • 有一段代码,是4层循环,最内层查询数据库,你认为应该如何优化?

  • 如何进行微服务的拆分,应该从哪几个方面考虑?参考答案:

  1. 业务因素:从业务角度出发,确定拆分的方案,边界要充分考虑业务的独立性和专业性,按服务的业务功能合理的划出拆分边界。
  2. 性能与系统扩展:提高系统的扩展性是拆分的一个理由之一,把具有不同扩展性需求的服务拆分出来分别部署、可以降低成本,提高效率。
  3. 技术因素:技术因素包括架构设计和解耦拆分,要考虑技术的可行性和可扩展性。
  4. 数据因素:数据因素包括数据的一致性、数据的隔离、数据的复制等,要考虑数据的安全性和可靠性。
  5. 运维因素:运维因素包括服务的部署、监控、日志等,要考虑运维的便捷性和可靠性。
  • 说下分布式事务的方案,如Seata XA、TCC、Saga、基于MQ,你的理解和在实现项目中的运用。
    • Seata相关知识:
      • 业务无侵入的:ATXA

XA是一个基于数据库实现的分布式事务协议,本质上和两阶段提交一样,需要数据库支持,Mysql5.6以上版本支持XA协议,其他数据库如Oracle,DB2也实现了XA接口1

经典的2PC(XA)往往对资源的锁定需要持续到第二阶段实际的提交或者回滚操作,AT模式,可以在第一阶段释放对资源的锁定,降低了锁范围。谁的功劳:回滚日志1

Seata 的 JDBC 数据源代理通过对业务 SQL 的解析,把业务数据在更新前后的数据镜像组织成回滚日志 。。。 任何提交的业务数据的更新一定有相应的回滚日志存在1

传统意义的脏读是读到了未提交的数据,Seata脏读是读到了全局事务下未提交的数据,全局事务可能包含多个本地事务,某个本地事务提交了不代表全局事务提交了。2

本地锁由本地事务管理,在分支事务Phase1结束时就直接释放。而全局锁由TC管理,在Phase2 全局提交时,全局锁马上可以释放。1

3一阶段本地事务提交前,需要确保先拿到 全局锁 。拿不到 全局锁 ,不能提交本地事务。

      • 业务侵入的:TCCSaga

4,5TCC 是一种侵入式的分布式事务解决方案,Try、Confirm、Cancel三个操作都需要业务系统自行实现,对业务系统有着非常大的入侵性,设计相对复杂,但优点是 TCC 完全不依赖数据库,能够实现跨数据库、跨应用资源管理
在这里插入图片描述

6Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者

    • 基于消息的分布式事务方案可参考本人博客另一篇之《4.6.8 分布式事务之消息机制》
    • Q:基于消息的方案,能实现强一致性吗?为什么
  • sql语句是怎样变成执行计划的?参考答案:
    下图出自《高性能mysql第三版》:
    在这里插入图片描述
    知乎—生成、查看、理解Oracle的执行计划
    当DB接收到一条SQL查询语句(INSERT, UPDATE, SELECT, DELETE)时,DB语法解析器(Parser)会先将其解析成一棵抽象语法树(Abstract Syntax Tree, AST),解析器在不影响执行结果的前提下可能会重写这个SQL来优化执行。
    接下来这棵生成的语法树会被送到DB的基于开销的优化器(Cost-Based Optimizer, CBO),优化器会创建执行计划(Execution Plan),并通过选择join类型(Nested Loops, Merge Join, Hash Join等)、join顺序、是否使用索引、使用什么索引等方式找到使用开销(CPU, IO, 内存)最小的计划作为最佳的执行计划。

  • 数据库的索引可能带来什么问题

  • 逻辑删除的好处?我回答方便恢复数据,面试官还不满意,我猜历史数据有挖掘价值?

  • 水平分库分表时,一个小表和一个大表join查询,小表未分库分表,大表分在四个结点上,如何提升性能?参考答案:我查了下好像不管是否分库分表,都有这些个优化办法(from newBing 以及7,8):

小表驱动大表:在join查询中,MySQL会选择数据量比较小的表作为驱动表,大表作为被驱动表。因此,我们可以将小表放在前面,让小表成为驱动表。

驱动表筛选出尽量少的行数:在where条件中加入筛选条件,让驱动表筛选出尽量少的行数。

非驱动表连接join字段最好是索引。


  1. seata AT模式实战 ↩︎ ↩︎ ↩︎ ↩︎

  2. 详解Seata AT 模式事务隔离级别与全局锁设计 ↩︎

  3. 官网:Seata AT 模式 ↩︎

  4. https://seata.io/zh-cn/blog/seata-tcc.html ↩︎

  5. 知乎:分布式事务Seata-TCC事务模式 ↩︎

  6. 官网:SEATA Saga 模式 ↩︎

  7. Mysql之小表驱动大表 ↩︎

  8. mysql驱动表与被驱动表及join优化 ↩︎

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐