面试总结之乐信(上)
面试内容:
一、画出项目 架构图
二、所处自己负责的业务模块,其中用到了哪些技术点
三、如何实现最终一致性分布式事务?
1. 二阶段提交:
a. 概念:参与者将操作成败通知协调者,再由协调者根据所有参与者的
反馈情报决定各参与者是否要提交操作还是中止操作。
b. 作用:主要保证了分布式事务的原⼦性;第一阶段为准备阶 段,第二阶段为提交阶段;
c. 缺点:不仅要锁住参与者的所有资源,而且要锁住协调者资源,开销大。一句话总结就是:2PC效率很低,对高并发很不友好。
2. 三阶段提交:
a. 概念:三阶段提交协议在协调者和参与者中都引入超时机制,并且把两阶段提交协议的第一个阶段拆分成了两步:询问,然后再锁资源,最后真正提交。这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
b. 缺点:如果进入PreCommit后,Coordinator发出的是abort请求,假设只有一个Cohort收到并进行了abort操作,而其他对于系统状态未知的Cohort会根据3PC选择继续Commit,此时系统状态发生不一致性。
3. 柔性事务:
a. 概念:所谓柔性事务是相对强制锁表的刚性事务而言。流程入下:服务器A的事务如果执行顺利,那么事务A就先行提交,如果事务B也执行顺利利,则事务B也提交,整个事务就算完成。但是如果事务B执行失败,事务B本身回滚,这时事务A已经被提交,所以需要执行一个补偿操作,将已经提交的事务A执行的操作反操作,恢复到未执行前事务A的状态。
b. 缺点:业务侵入性太强,还要补偿操作,缺乏普遍性,没法大规模推广。
4. 消息最终⼀一致性解决⽅方案之RabbitMQ实现:
a. 实现:发送方确认+消息持久化+消费者确认。
四.索引的B+树结构是咋样的?
1. B-tree:
B-tree 利用了磁盘块的特性进行构建的树。每个磁盘块一个节点,每个节点包含了关键字。把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度。
B-tree巧妙利⽤了磁盘预读原理,将一个节点的⼤小设为等于一个页(每⻚为4K),这样每个节点只需要一次I/O就可以完全载入。
B-tree 的数据可以存在任何节点中。
2. B+tree:
B+tree 是 B-tree 的变种,B+tree 数据只存储在叶子节点中。这样在B
树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定。
五.说⾃己了解的设计模式?Spring中用到了哪些设计模式?⾃己有用过哪些设计模式吗?
1. spring中的设计模式:
a. 简单工厂:spring中的BeanFactory就是简单工厂模式的体 现, 根据传入一个唯一的标识来获得bean对象,但是否是在传入 参数后创建还是传入参数前创建这个要根据具体情况来定。
b. 单例例模式: Spring下默认的bean均为singleton 。
c. 代理理模式: 为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看 和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
d. 观察者模式:定义对象间的一种一对多的依赖关系,当⼀个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。spring中Observer模式常用的地方是listener的实现。如ApplicationListener。