🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
🍁🍁🍁🍁🍁🍁🍁🍁
接下来说一下分布式架构中的一些面试连环炮,主要从链路监控、事务提交、这几个方面来说一下
主要说一下分布式系统链路监控实现的原理是什么
分布式系统链路监控主要适用于进行性能监控和故障排查,国内常用的有 CAT(大众点评的) 和 zipkin(Twitter 的)
其实链路监控主要就是做一个框架,包含一个客户端服务端:
我之前面试的时候,也碰到过一个面试官给我说,让我设计一个分布式系统链路监控的方案,画了一个图如下(这里主要参考了美团点评的 CAT 监控框架,美团技术团队官方文章:[深度剖析开源分布式监控CAT](https://tech.meituan.com/2018/11/01/cat-in-depth-java-application-monitoring.html)):
这里我也简单说一下流程:
分布式事务的两阶段提交(Two-phase Commit,简称2PC)是分布式系统中用于确保事务原子性的协议。它由两个主要阶段组成:
两阶段提交协议的目的是确保分布式事务的一致性。在分布式系统中,事务可能涉及多个节点,每个节点上的操作必须同时成功或同时失败,以保持数据的完整性和一致性。
然而,两阶段提交协议也存在一些问题,主要包括:
为了解决这些问题,有些系统可能会采用改进的两阶段提交协议,或者使用其他分布式事务处理机制,如三阶段提交(3PC)、补偿事务(Compensating Transactions)或最终一致性(Eventual Consistency)等。
分布式协调框架 ZooKeeper 使用的就是 2PC,由于 2PC 是同步阻塞的,因此 zk 适合小集群部署
分布式事务的三阶段提交(Three-phase Commit,简称3PC)是一种用于确保分布式系统中事务的原子性和一致性的协议。它在两阶段提交(Two-phase Commit,简称2PC)的基础上增加了一个额外的阶段,以解决2PC中可能存在的同步问题。三阶段提交包括以下三个阶段:
CanCommit
消息,询问是否可以执行事务提交操作。CanCommit
消息后,会执行事务操作,并将操作结果记录在本地日志中,但不提交事务。CanCommit
响应,并且所有参与者都表示可以提交,协调者会发送PreCommit
消息给所有参与者。PreCommit
消息后,会执行事务的预提交操作,并将结果(成功或失败)记录在本地日志中,然后向协调者发送Ack
消息。Ack
消息,或者在超时时间内没有收到任何Ack
消息,协调者会认为事务可以提交。DoCommit
消息,指示它们提交事务。DoCommit
消息后,会正式提交事务,并将提交结果记录在本地日志中。Ack
消息。Ack
消息后,事务提交过程完成。三阶段提交协议的目的是为了解决两阶段提交协议中的同步问题,特别是在网络分区(Network Partition)或协调者故障的情况下。在2PC中,如果协调者在发送Commit
消息后崩溃,而参与者没有收到Commit
消息,那么参与者将无法提交事务,这可能导致数据不一致。通过引入预提交阶段,3PC允许参与者在提交之前确认他们已经准备好,从而减少了这种不一致性的风险。
然而,三阶段提交协议并没有完全解决2PC的所有问题,它仍然可能面临一些同步问题,例如,如果协调者在发送PreCommit
消息后崩溃,而参与者在没有收到DoCommit
消息的情况下也崩溃,那么参与者可能会在重启后尝试提交事务,这可能导致数据不一致。因此,在实际应用中,需要根据系统的特定需求和可用资源来选择最合适的事务处理策略。
总结一下:2PC 由于只有两个阶段,性能是比 3PC 要好的,而 3PC 通过增加了一个阶段,提供了更好的故障恢复能力
Snowflake 算法是由Twitter开发的一个分布式ID生成算法,用于在分布式系统中生成唯一且有序的ID。它的核心思想是将一个64位的长整型数字分割成不同的部分,每个部分代表不同的信息,从而确保ID的唯一性和有序性。Snowflake算法的ID结构通常如下:
在使用 Snowflake 生成的唯一 ID 有 41 位是时间戳,那么假如系统时钟回拨,系统时间比上次生成唯一 ID 的时间小,那么可能会生成重复的 ID
为什么会发送时钟回拨呢?
当前的机器的会跟一台基准时间服务器进行时间校准,如果你的机器的时间跑的稍微快了一点,此时跟基准时间服务器进行了校准,你的时间被校准后就倒退回去了
怎么解决呢?
如果发生了时钟回拨,此时你看看时钟回到了之前的哪一毫秒里去,直接接着在那一毫秒里的最大的 ID 继续自增就可以了