大厂Java面试-分布式架构演进史(下)

简介: 大厂Java面试-分布式架构演进史(下)

7 分布式领域中冯诺依曼的变化

前面我们讲过经典理论-冯.诺依曼体系,计算机硬件由运算器、 控制器、存储器、输入设备、输出设备五大部分组成。不管架 构怎么变化,计算机仍没有跳出该体系的范畴;

输入设备的变化

在分布式系统架构中,输入设备可以分两类,第一类是互相连接的 多个节点,在接收其他节点传来的信息作为该节点的输入;另一种


就是传统意义上的人机交互的输入设备了


输出设备的变化

输出和输入类似,也有两种,一种是系统中的节点向其他节点传输 信息时,该节点可以看作是输出设备;另一种就是传统意义上的人 际交互的输出设备,比如用户的终端


控制器的变化

在单机中,控制器指的是 CPU 中的控制器,在分布式系统中,控 制器主要的作用是协调或控制节点之间的动作和行为;比如硬件负 载均衡器;LVS 软负载;规则服务器等


运算器

在分布式系统中,运算器是由多个节点来组成的。运用多个节点的 计算能力来协同完成整体的计算任务


存储器

在分布式系统中,我们需要把承担存储功能的多个节点组织在一起, 组成一个整体的存储器;比如数据库、redis(key-value 存储)

7.1 分布式系统的难点

毫无疑问,分布式系统对于集中式系统而言,在实现上会更加复杂。分布式系统将会是更难理解、设计、构建 和管理的,同 时意味着应用程序的根源问题更难发现。

三态

在集中式架构中,我们调用一个接口返回的结果只有两种, 成 功或者失败,但是在分布式领域中,会出现“超时”这个状态。

分布式事务

事务就是一些列操作的原子性保证。单机时,我们能仅依靠本机的数据库连接和组件就做到事务控制。


但在分布式下,业务的原子性操作大多跨服务,这就产生分布式事务。例如 A 和 B 操作分别是不同服务下的同一个事务操作内的操作,A 调用 B,A 若可清楚 B 是否成功提交从而控制自身的提交or回滚。但在分布式系统中调用会出现一个新状态就是超时:即A 无法知道 B 是成功还是失败,这时 A 是提交本地事务还是回滚呢?

这是一个很难回答的问题,如果强行保证事务一致性,可采取分布式锁,但那会增加系统复杂度&&增大系统性能开销,而且事务跨越的服务越多,消耗的资源越大,性能越低,所以


最好的解决方案就是避免分布式事务


还有一种解决方案就是重试机制,但重试如果不是重试查询接口,必然涉及到数据库变更,如果第一次调用成功但是没返回成功结果,那调用方第二次调用对调用方来说依然是重试,但对于被调用方来说是重复调用。

例如 A 向 B 转账,A-100,B + 100,这会导致 A 扣了 100,而 B 增加 200。这样的结果不是期望的,因此需在要写入的接口做幂等设计。多次调用和单次调用是一样效果。通常可设置一个唯一键,在写入时查询是否已经存,避免重复写入。但幂等设计的一个前提是服务高可用,否则无论怎么重试都不能调用返回 一个明确的结果,调用方就会一直等待。虽然可以限制重试的次数, 但这已进入异常状态了,甚至到了极端情况还是需要人工补偿。

根据 CAP 和 BASE 理论可知,不可能在高可用和分布式情况下还做到一致性,所以一般都是做最终一致性保证。


负载均衡

每个服务单独部署,为了达到高可用,每个服务至少是两台机 器,因为互联网公司一般使用可靠性不是特别高的普通机器, 长期运行宕机概率很高,所以两台机器能够大大降低服务不可 用的可能性,这正大型项目会采用十几台甚至上百台来部署一 个服务,这不仅是保证服务的高可用,更是提升服务的 QPS, 但是这样又带来一个问题,一个请求过来到底路由到哪台机器? 路由算法很多,有 DNS 路由,如果 session 在本机,还会根据 用户 id 或则 cookie 等信息路由到固定的机器,当然现在应用


服务器为了扩展的方便都会设计为无状态的,session 会保存 到专有的 session 服务器,所以不会涉及到拿不到 session 问 题。那路由规则是随机获取么?这是一个方法,但是据我所知, 实际情况肯定比这个复杂,在一定范围内随机,但是在大的范 围也会分为很多个域,例如如果为了保证异地多活的多机房, 夸机房调用的开销太大,肯定会优先选择同机房的服务,这个 要参考具体的机器分布来考虑。


一致性

数据被分散或者复制到不同的机器上,如何保证各台主机之间 的数据的一致性将成为一个难点。

故障的独立性

分布式系统由多个节点组成,整个分布式系统完全出问题的概 率是存在的,但是在时间中出现更多的是某个节点出问题,其 他节点都没问题。这种情况下我们实现分布式系统时需要考虑 得更加全面些



目录
相关文章
|
1月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
5天前
|
设计模式 存储 算法
分布式系统架构5:限流设计模式
本文是小卷关于分布式系统架构学习的第5篇,重点介绍限流器及4种常见的限流设计模式:流量计数器、滑动窗口、漏桶和令牌桶。限流旨在保护系统免受超额流量冲击,确保资源合理分配。流量计数器简单但存在边界问题;滑动窗口更精细地控制流量;漏桶平滑流量但配置复杂;令牌桶允许突发流量。此外,还简要介绍了分布式限流的概念及实现方式,强调了限流的代价与收益权衡。
43 11
|
7天前
|
设计模式 监控 Java
分布式系统架构4:容错设计模式
这是小卷对分布式系统架构学习的第4篇文章,重点介绍了三种常见的容错设计模式:断路器模式、舱壁隔离模式和重试模式。断路器模式防止服务故障蔓延,舱壁隔离模式通过资源隔离避免全局影响,重试模式提升短期故障下的调用成功率。文章还对比了这些模式的优缺点及适用场景,并解释了服务熔断与服务降级的区别。尽管技术文章阅读量不高,但小卷坚持每日更新以促进个人成长。
33 11
|
8天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
43 11
|
10天前
|
自然语言处理 负载均衡 Kubernetes
分布式系统架构2:服务发现
服务发现是分布式系统中服务实例动态注册和发现机制,确保服务间通信。主要由注册中心和服务消费者组成,支持客户端和服务端两种发现模式。注册中心需具备高可用性,常用框架有Eureka、Zookeeper、Consul等。服务注册方式包括主动注册和被动注册,核心流程涵盖服务注册、心跳检测、服务发现、服务调用和注销。
46 12
|
22天前
|
消息中间件 架构师 数据库
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
45岁资深架构师尼恩分享了一篇关于分布式事务的文章,详细解析了如何在10Wqps高并发场景下实现分布式事务。文章从传统单体架构到微服务架构下分布式事务的需求背景出发,介绍了Seata这一开源分布式事务解决方案及其AT和TCC两种模式。随后,文章深入探讨了经典ebay本地消息表方案,以及如何使用RocketMQ消息队列替代数据库表来提高性能和可靠性。尼恩还分享了如何结合延迟消息进行事务数据的定时对账,确保最终一致性。最后,尼恩强调了高端面试中需要准备“高大上”的答案,并提供了多个技术领域的深度学习资料,帮助读者提升技术水平,顺利通过面试。
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
|
4天前
|
消息中间件 NoSQL Java
面试官必问的分布式锁面试题,你答得上来吗?
本文介绍了分布式锁的概念、实现方式及其在项目中的应用。首先通过黄金圈法则分析了分布式锁的“为什么”、“怎么做”和“做什么”。接着详细讲解了使用 Redisson 和 SpringBoot + Lettuce 实现分布式锁的具体方法,包括代码示例和锁续期机制。最后解释了 Lua 脚本的作用及其在 Redis 中的应用,强调了 Lua 保证操作原子性的重要性。文中还提及了 Redis 命令组合执行时的非原子性问题,并提供了 Lua 脚本实现分布式锁的示例。 如果你对分布式锁感兴趣或有相关需求,欢迎关注+点赞,必回关!
16 2
|
27天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
67 14