面试总结

8月7日

两阶段提交(ZooKeeper分布式提交算法)

  • 提交事物请求(第一阶段)
    • 事物询问:协调者向所有的参与者发送事物内容,询问是否可以执行事物操作,并开始等待各参与者的响应。
    • 执行事物:各参与者节点执行事物操作,并将Undo和Redo信息记入事物日志中。
    • 各参与者向协调者反馈事物询问的响应:如果参与者成功执行了事物操作,那么就反馈给协调者Yes响应,表示事物可以执行;如果参与者没有成功执行事物,那么就反馈给协调者No响应,表示事物不可以执行。
  • 执行事物请求(第二阶段)

    假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事物响应。

    • 发送提交请求:协调者向所有参与者节点发出Commit请求
    • 事物提交:参与者接收到Commit请求后,会正式执行事物提交操作,并在完成提交之后释放在整个事物执行期间占有的事物资源。
    • 反馈事物提交结果:参与者在完成事物提交之后,向协调者发送Ack消息。
    • 完成事物: 协调者接收到所有参与者反馈的Ack消息后,完成事物。

算法思路:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作

缺点:

  1. 执行过程中,同步阻塞
  2. 单点故障,协调者一旦发生故障,参与者一直阻塞
  3. 数据不一致,在提交时由于网络波动,只有一部分收到了commit请求,所以出现了数据不一致

三阶段提交

区别:三阶段提交在协调者和参与者中引入超时机制,并且把两阶段提交的第一阶段拆分为两步:询问,然后锁住资源,最后真正提交

  • 阶段1: CanCommit

协调者询问参与者是否可以提交事物

  • 阶段2: PreCommit

预提交,分为2种情况

  • 第一种是上一阶段得到的反馈都是yes,那么向所有参与者发送preCommit请求,进入prepared阶段,参与者和接收到preCommit请求后会执行事务操作,并将undo和redo信息记录到事务日志中。如果一个参与者成功地执行了事务操作,则返回ACK响应,同时开始等待最终指令
  • 有1个以上的NO:中断事务,协调者发送abort请求,参与者收到请求或者超时,执行事务中断

  • 阶段3: DoCommit

根据第二阶段的响应来决定是否可以继续事务操作,分2种情况

  • 协调者得到了参与者发出的ACK请求:那么它将预提交变更为提交状态
  • 协调者从参与者没有得到ACK的反馈, 也可能是接收者发送的不是ACK响应,也可能是响应超时 ,执行事务中断

缺点:如果进入PreCommit后,协调者发出的是abort请求,假设只有一个Cohort收到并进行了abort操作,
而其他对于系统状态未知的Cohort会根据3PC选择继续Commit,此时系统状态发生不一致性。

Spring注入bean的3种方法

  1. 注解
  2. setter
  3. 构造器

synchronized与锁的区别

23种设计模式

  • 简单工厂

    • 简单工厂用于创建实例的方法通常为静态方法,因此简单工厂模式又被称为静态工厂方法
    • 需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程

优点:1. 工厂类需要包涵必要的逻辑判断,可以决定什么时候创建哪一个产品实例。

2. 客户端无需知道所创建的具体产品类名,知道参数即可
3. 可以引入配置文件,在不修改客户端的情况下更换添加新的具体产品
  • 抽象工厂

Java中,遍历数据结构Enumeration和Iterator相比有什么优劣?

赏个🍗吧
0%