架构

什么是架构

一个软件系统,随着功能越来越多,调用量急剧增长,整个系统逐渐碎片化,越来越无序,最终无法维护和扩展。架构实质上是对软件系统进行有序化的重构。基本上就是分与合,先把系统打散,然后重新组合。分的过程是把系统拆分为各个子系统 / 模块 / 组件,拆的时候,首先要解决每个组件的定位问题,然后才能划分彼此的边界,实现合理的拆分。合就是根据最终要求,把各个分离的组件有机整合在一起。
拆分的结果使开发人员能够做到业务聚焦、技能聚焦,实现开发敏捷,合的结果是系统变得柔性,可以因需而变,实现业务敏捷。

架构分类

架构一般可分业务架构、应用架构、技术架构。

  1. 业务架构从概念层面帮助开发人员更好的理解系统,比如业务流程、业务模块、输入输出、业务域
  2. 应用架构从逻辑层面帮助开发落地系统,如数据交互关系、应用形式、交互方式,是的整个系统逻辑上更容易理解,步入大家熟知的 SOA 就属于应用架构的范畴
  3. 技术架构主要解决技术平台选型、如操作系统、中间件、设备、多机房、水平扩展、高可用等问题

需要注意,系统或者架构首先都是为人服务的,系统的有序度高,应用逻辑合理,业务概念清晰是第一位。在设计具体架构时,首先需要关注的是业务架构和应用架构。

架构的演进

最开始因为业务简单,访问量不多,往往系统及数据库部署在单机服务器上。以一个电商网站为例。

分布式架构 难点 分布式架构的理解_学习

随着网站的功能越来越多,访问量越来越大。因为访问数据库是比较耗费资源的,所以数据库的压力会比较大,这时可以将整个个系统分为应用服务器和数据库服务器来部署。

分布式架构 难点 分布式架构的理解_学习_02

当系统的访问量进一步增大,应用服务器也有压力了,这时可以多部署一台应用服务器,通过水平扩容,将单机变成集群。而两个节点的访问可以通过DNS或者负载均衡设备来实现。

分布式架构 难点 分布式架构的理解_开发语言_03


水平扩容:通过增加机器来支撑访问量及数据量增长的方式。

垂直扩容:通过升级或者增加单台机器的硬件来支撑访问量以及数据量增长的方式。

负载均衡算法
轮询(Round Robin)法
将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
缺点:当集群中服务器硬件配置不同、性能差别大时,无法区别对待。

随机法
通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。随着调用量的增大,其实际效果越来越接近于平均分配流量到后台的每一台服务器,也就是轮询法的效果
优点:简单使用,不需要额外的配置和算法。
缺点:随机数的特点是在数据量大到一定量时才能保证均衡,所以如果请求量有限的话,可能会达不到均衡负载的要求。

IP地址哈希法
根据服务消费者请求客户端的 IP 地址,通过哈希函数计算得到一个哈希值,将这个哈希值和服务器列表的大小进行取模运算,得到的结果便是要访问的服务器地址的序号。采用这个方法进行负载均衡,相同的 IP 客户端,如果服务器列表不变,将映射到同一个后台服务器进行访问。

加权轮询(Weight Round Robin)法
不同的后台服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不一样。跟配置高、负载低的机器分配更高的权重,使其能处理更多的请求,而配置低、负载高的机器,则给其分配较低的权重,降低其系统负载,加权轮询很好的处理了这一问题,并将请求按照顺序且根据权重分配给后端

最小连接数法
前面几种方式都是通过对请求次数的合理分配最大可能提高服务器的利用率,但是实际上,请求次数的均衡并不能代表负载的均衡。所以,引入了最小连接数法。它正是根据后端服务器当前的连接情况,动态的选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能的提高后台服务器利用率,将负载合理的分流到每一台服务器。

随着业务的继续增长,数据量和访问量持续增加。数据库的压力也会越来越大。而对于大型网站来说,有不少业务是读多写少的情况,这种情况下,我们可以考虑采用读写分离的方式来优化数据库的压力。

分布式架构 难点 分布式架构的理解_java_04

在系统中,对于一些热点数据,往往需要很快的响应速度,相对于提高关系型数据库的响应速度,我们可以使用缓存或搜索引擎索引来实现这个效果。

分布式架构 难点 分布式架构的理解_数据库_05

而当系统继续发展扩大,用户越来越多,数据库又会遇到瓶颈。这时候我们可以采用分库分表的方式。专库专用。

数据垂直拆分。垂直拆分的意思是把数据库中不同的业务数据拆分到不同的数据库中。

分布式架构 难点 分布式架构的理解_java_06


不同业务的数据从原来的一个数据库拆分到了多个数据库中,需要考虑处理单机跨业务的事务,比如使用分布式事务,或者去掉事务不追求强事务的支持数据水平拆分。数据水平拆分就是把同一个表的数据拆分到两个数据库中,产生数据水平拆分的原因是某个业务的数据表的数据量或者更新量达到了单个数据库的瓶颈,这个时候就可以把表拆到两个或者多个数据库中。

数据水平拆分与数据垂直拆分的区别是,垂直拆分是把不同的表拆分到不同的数据库,而水平拆分是把同一个表拆分到不同的数据库中。

分布式架构 难点 分布式架构的理解_数据库_07

通过部署应用服务器集群,可以分担访问压力。但也有一个问题,集群的每个节点的功能都是一样的,这时我们可以将应用拆分,将不同的业务功能拆分成一个个的服务中心。不同的服务中心提供不同的业务服务,处于最下层的则是业务的数据库。

分布式架构 难点 分布式架构的理解_学习_08

分布式架构

分布式架构就是用来解决越来越大的流量压力。通过部署应用集群,数据库集群等将整个系统的压力分摊到一个个服务器节点上。而这些节点之间仅仅通过消息传递来通信并协调行动。对于用户而言,是区分不出系统是部署在单节点还是集群上的。
之所以使用分布式架构:升级单机处理能力的性价比越来越低;单机服务器的处理能力存在瓶颈;单机服务器的稳定性不高;一旦服务器出现问题,整个系统都将不可用,而使用分布式架构,单节点宕机后,还有其他节点可用,不会影响到整个系统。