1 基础概念
系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是“总体”“整体”或“联盟”。
子系统也是由一群有关联的个体所组成的系统,多半会是更大系统中的一部分。
软件模块(Module)是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位。模块的接口表达了由该模块提供的功能和调用它时所需的元素。模块是可能分开被编写的单位。这使它们可再用和允许人员同时协作、编写及研究不同的模块。(逻辑角度拆分,划分目的是职责分离)
软件组件定义为自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。(物理角度拆分,划分目的是单元复用,独立且可替换)
软件框架(Software framework)通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
软件架构指软件系统的“基础结构”,创造这些基础结构的准则,以及对这些结构的描述。
架构是顶层设计;框架是面向编程或配置的半成品;组件是从技术维度上的复用;模块是从业务维度上职责的划分;系统是相互协同可运行的实体。
架构设计三原则:合适原则,简单原则,演化原则。
设计流程:识别复杂度,设计备选方案,评估和选择备选方案,详细方案设计。
2 复杂度来源
①高性能
提高单机性能+集群。性能是软件的一个重要质量属性。衡量软件性能包括了响应时间、TPS、服务器资源利用率等客观指标,也可以是用户的主观感受(从程序员、业务用户、终端用户/客户不同的视角,可能会得出不同的结论)。
常用手段:读写分离,分库分表,NoSQL,缓存,负载均衡,Reactor。
负载均衡:硬件F5(百万级),A10。软件Nginx(万级,7层),LVS(十万级,4层)
每秒事务处理量(TPS,Transaction Per Second)每秒钟系统能够处理的交易或事务的数量。它是衡量系统处理能力的重要指标。
每秒查询率(QPS,Queries Per Second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
Reactor:I/O多路复用+资源池(进程池/线程池)
进程池:不再单独为每个连接创建进程,而是创建一个进程池,将连接分配给进程,一个进程可以处理多个连接的业务。
I/O多路复用:只有当连接上有数据的时候进程才去处理。当多条连接共用一个阻塞对象后,进程只需要在一个阻塞对象上等待,而无须再轮询所有连接,当某条连接有新的数据可以处理时,操作系统会通知进程,进程从阻塞状态返回,开始进行业务处理。
单Reactor单进程(Redis),单Reactor多线程,多Reactor多进程(Nginx),多Reactor多线程(Memcache,Netty)
②高可用
是系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
常用手段:双机架构(主从,主备,主主,主从/主备切换),集群,分区,异地多活(同城,跨地,跨国)。
业务分级(核心,访问量大,主要收入)——数据分类(数据量,唯一性,实时性,可丢失性,可恢复性)——数据同步(消息队列,二次读取,存储系统同步,回源读取,重新生成)——异常处理(多通道同步,同步和访问结合,日志记录,用户补偿)
异地多活要点:核心业务异地多活,核心数据最终一致,多手段同步数据,保证绝大部分用户异地多活。
CAP理论:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性 (Partition Tolerance)三者中的两个,另外一个必须被牺牲。
ACID理论:是数据库管理系统为了保证事务的正确性而提出来的一个理论,ACID包含四个约束
Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
Isolation(隔离性):数据库允许多个并发事务同时对数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
BASE理论:是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency),核心思想是即使无法做到强一致性(CAP的一致性就是强一致 性),但应用可以采用适合的方式达到最终一致性。
FMEA(Failure mode and efects analysis,故障模式与影响分析):是一种在各行各业都有广泛应用的可用性分析方法,通过对系统范围内潜在的故障模式加以分析,并按照严重程度进行分类,以确定失效对于系统的最终影响。
③可扩展性
业务需求、运行环境方面的变化都会导致软件系统发生变化,而这种软件系统对上述变化的适应能力就是可扩展性。
面向流程拆分:分层架构。2层(C/S架构、B/S架构),3层(MVC架构、MVP架构),多层(逻辑分层)。
面向服务拆分:SOA(Service Oriented Architecture,面向服务的架构)、微服务。
面向功能拆分:微内核架构,也被称为插件化架构。
④低成本:往往只有“创新”才能达到低成本目标,引入新技术或创造新技术。
⑤安全:功能安全其实就是“防小偷”,架构安全就是“防强盗”。
⑥规模:是“量变引起质变”,当数量超过一定的阈值后,复杂度会发生质的变化。功能增加/数据增加。
3 相关技术
①存储技术
NoSQL
K-V存储:解决关系数据库无法存储数据结构的问题,以Memcache,Redis为代表。
文档数据库:解决关系数据库强schema约束的问题,以MongoDB为代表。
列式数据库:解决关系数据库大数据场景下的I/O问题,以HBase为代表。
全文搜索引擎:解决关系数据库的全文搜索性能问题,以Elasticsearch为代表。
SQL:MySQL,PostgreSQL,Oracle。
小文件存储:淘宝的TFS、京东JFS、Facebook的Haystack。
大文件存储:Hadoop、HBase、Storm、Hive,淘宝的云梯系统、腾讯的TDW系统。
②开发技术
开发框架
Java的SSH、SpringMVC、Play等。
Ruby的Ruby on Rails。
PHP的ThinkPHP。
Python的Django。
web服务器
Java的Tomcat、JBoss、Resin等,PHP/Python的用Nginx,最保险的就是用Apache了,什么语言都支持。
容器
Docker。
消息队列
RocketMQ、Kafka、ActiveMQ。
③网络技术
负载均衡
DNS,Nginx 、LVS 、F5,如阿里云的SLB、UCloud的ULB,CDN