204 架构设计的目的和原则

什么是框架,什么是架构?

  • 框架Framwork关注的是规范,可以是组件规范,例如MVC框架(MVC开发规范)。也可以是提供了基于规范来发开的产品,例如SpringMVC就是基于MVC的开发框架。
  • 架构Architecture关注的是结构,指软件系统的顶层结构。同一个系统,从不同角度分解,可以有不同的架构,例如业务逻辑角度、物理部署角度、开发规范角度。

相比较而言,架构比框架关注的东西更多,而且一个架构可能会使用多个框架。

架构设计的目的

架构设计的目的是为了解决软件复杂度带来的问题。

软件复杂度主要分为以下六个方面: 性能、可用性、可扩展性、成本、安全、规模。

软件复杂度来源

性能

性能复杂度又可分为单机复杂度和集群复杂度。

解决单机复杂度主要依靠提升计算机硬件处理能力,经历了单进程 -> 多进程 -> 多线程 -> 多CPU的历程。

集群复杂度主要体现在如何让大量的机器协同配合,提高性能。涉及到在集群环境下任务如何分配、如何分解。

使用集群时并不是机器增加了多少倍,处理性能就能增加多少倍,而是存在边际效应,随着机器的不算增加,带来的收益是不断减少的。

高可用

高可用可以区分为计算高可用和存储高可用两个方面。

计算高可用一般采取集群+主备的方式保证,面临的主要问题有。

1、需要任专门的任务调度器。 2、如何管理任务调度器与业务服务器之间的连接。 3、选择合适的分配算法。 4、主备的选择。

存储高可用则采用主备方式存储数据,难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响。

著名的CAP理论就是从理论上说明了存储高可用的复杂性。

可扩展性

保证系统可扩展性,有两个基本条件:正确预测变化、完美封装变化。

预测变化的复杂度体现在:

1、不可能每个设计点都考虑可扩展性。 2、不能完全不考虑可扩展性。 3、没有预测是一定正确的。

封装变化则一般采用分层的方式将系统分为多个层次,这样在变化时可以将变化限制在局部。封装变化面临的主要难点是:

1、如何分层。 2、层次多了以后增加了系统的复杂度。

成本

在成本一定的情况下,如何保证高可用、高性能、高扩展,是架构设计必须要平衡的事情。

成本与三高要求天然存在冲突,因此最合适的情况就是在成本允许范围内,解决最重要的复杂度。

另外,还可以通过创新的方式降低成本,例如NoSQL的出现解决了关系数据库高并发场景访问的问题;Hadoop的出现则解决了传统文件系统无法应对海量数据存储和计算的问题。

安全

安全可以分为两类:

1、功能安全。系统自身漏洞带来的安全问题,例如XSS攻击,SQL注入,密码暴力破解等等。 2、架构安全。针对系统架构的攻击,例如DDos攻击。主要的防御措施是增加防火墙。

规模

随着系统规模越来越庞大,将一个大系统拆分成若干小系统成为业内主流的处理方式,例如目前非常流行微服务架构。

但是拆分之后也会带来很多问题。例如:

1、功能模块越来越多,导致系统复杂度急剧上升。 2、数据越来越多,维护、访问、修改、计算都会变得更加困难。

架构设计的原则

  • 合适原则:合适优于业界领先。针对当前系统面临的主要问题,选择合适的架构,而不是过度设计。
  • 简单原则:简单优于复杂。能用简单的方案实现,就不要用复杂的方案。
  • 演化原则:演化优于一步到位。可以在系统发开过程逐步演化升级架构,而不要想着一步到位。一步到位一方面成本过高,另一方面也很难预测。
下篇104 dubbo实现了哪些微服务组件