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

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

1.png


6 架构的发展过程

一个成熟的大型网站系统架构并不是一开始就设计的非常完美,也不是一开始就具备高性能、高可用、安全性等特性,而 是随着用户量的增加、业务功能的扩展逐步完善演变过来的。 在这个过程中,开发模式、技术架构等都会发生非常大的变化。 而针对不同业务特征的系统,会有各自的侧重点,比如像淘宝这类的网站,要解决的是海量商品搜索、下单、支付等问题;


像腾讯,要解决的是数亿级别用户的实时消息传输;百度所要 解决的是海量数据的搜索。每一个种类的业务都有自己不同的 系统架构。我们简单模拟一个架构演变过程。


我们以 javaweb 为例,来搭建一个简单的电商系统,从这个系 统中来看系统的演变历史;要注意的是,接下来的演示模型, 关注的是数据量、访问量提升,网站结构发生的变化, 而不是 具体关注业务功能点。

其次,这个过程是为了让大家更好的了 解网站演进过程中的一些问题和应对策略。

假如我们系统具备以下功能:

用户模块:用户注册和管理

商品模块:商品展示和管理

交易模块:创建交易及支付结算

6.1 阶段一 - 单应用架构

image.png

网站的初期也可以认为是互联网发展的早起,我们经常会在单 机上跑我们所有的程序和软件。 把所有软件和应用都部署在一台机器上,这样就完成一个简单 系统的搭建,这个时候的讲究的是效率

6.2 阶段二 - 应用服务器和数据库服务器分离

1.png

随着网站的上线,访问量逐步上升,服务器的负载慢慢提高, 在服务器还没有超载的时候,我们应该做好规划,提升网站的 负载能力。假如代码层面的优化已经没办法继续提高,在不提 高单台机器的性能,增加机器是一个比较好的方式,投入产出比非常高。这个阶段增加机器的主要目的是讲 web 服务器和 数据库服务器拆分,这样不仅提高了单机的负载能力,也提高 了容灾能力

6.3 阶段三 - 应用服务器集群(应用服务器负载告警,如何让应用服 务器走向集群)


1.png

随着访问量的继续增加,单台应用服务器已经无法满足需求。 在假设数据库服务器还没有遇到性能问题的时候,我们可以增 加应用服务器,通过应用服务器集群将用户请求分流到各个服务器中,从而继续提升负载能力。此时多台应用服务器之间没 有直接的交互,他们都是依赖数据库各自对外提供服务架构发展到这个阶段,各种问题也会慢慢呈现

  1. 用户请求由谁来转发到具体的应用服务器
  2. 用户如果每次访问到的服务器不一样,那么如何维护
    session

1.png

6.4 阶段四 - 数据库压力变大,数据库读写分离

1.png

架构演变到这里,并不是终点。上面我们把应用层的性能拉上来了, 但是数据库的负载也在慢慢增大,那么怎么去提高数据库层面的负载呢?

有了前面的思路以后,自然会想到增加服务器。但是假如我们单纯的把数据库一分为二,然后对于后续数据库的请求,分别负 载到两台数据库服务器上,那么一定会造成数据库不统一的问题。 所以我们一般先考虑读写分离的方式


这个架构的变化会带来几个问题


  1. 主从数据库之间的数据同步 ; 可以使用 mysql 自带的master-slave 方式实现主从复制
  2. 对应数据源的选择 ; 采用第三方数据库中间件,例如 mycat

6.5 阶段五 - 使用搜索引擎缓解读库的压力

1.png

数据库做读库的话,尝尝对模糊查找效率不是特别好,像电商类的网站,搜索是非常核心的功能,即便是做了读写分离,这个问题也 不能有效解决。那么这个时候就需要引入搜索引擎了 使用搜索引擎能够大大提高我们的查询速度,但是同时也会带来一 些附加的问题,比如维护索引的构建。

6.6 阶段六 - 引入缓存机制缓解数据库的压力

1.png

随着访问量的持续增加,逐渐出现许多用户访问统一部分内容的情况,对于这些热点数据,没必要每次都从数据库去读取,我们可以 使用缓存技术,比如 memcache、redis 来作为我们应用层的缓存; 另外在某些场景下,比如我们对用户的某些 IP 的访问频率做限制, 那这个放内存中又不合适,放数据库又太麻烦,这个时候可以使用 Nosql 的方式比如 mongDB 来代替传统的关系型数据库


6.7 阶段七 - 数据库的水平/垂直拆分

1.png

我们的网站演进的变化过程,交易、商品、用户的数据都还在同一 个数据库中,尽管采取了增加缓存,读写分离的方式,但是随着数 据库的压力持续增加,数据库的瓶颈仍然是个最大的问题。因此我 们可以考虑对数据的垂直拆分和水平拆分 垂直拆分:把数据库中不同业务数据拆分到不同的数据库


水平拆分:把同一个表中的数据拆分到两个甚至跟多的数据库中,水平拆分的原因是某些业务数据量已经达到了单个数据库的瓶颈,这时可以采取讲表拆分到多个数据库中

1.png

6.8 阶段八 - 应用的拆分

1.png

随着业务的发展,业务越来越多,应用的压力越来越大。工程规模 也越来越庞大。这个时候就可以考虑讲应用拆分,按照领域模型讲 我们的用户、商品、交易拆分成多个子系统


这样拆分以后,可能会有一些相同的代码,比如用户操作,在商品 和交易都需要查询,所以会导致每个系统都会有用户查询访问相关 操作。这些相同的操作一定是要抽象出来,否则就会是一个坑。所 以通过走服务化路线的方式来解决


/

1.png

那么服务拆分以后,各个服务之间如何进行远程通信呢?

通过 RPC 技术,比较典型的有:webservice、hessian、http、RMI 等等 前期通过这些技术能够很好的解决各个服务之间通信问题,but, 互联网的发展是持续的,所以架构的演变和优化还在持续。

1.png

1.png


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

热门文章

最新文章