[TOC]
## 一、架构设计原则综述
常见架构设计方案质量属性点有:性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性等。在评估这些质量属性时,需要遵循架构设计原则:
1. 合适原则,
2. 简单原则,避免贪大求全。
3. 基本上某个质量属性能够满足一定时期业务发展就可以了。
属性 | 集群方案 | 拆分方案 | 备注
---|---|---|---
性能 | 中,继续扩展下去,MySQL会成为瓶颈|高,系统拆分为子系统,子系统又可以做成集群方案 | 拆分方案优
复杂度 | 低,只需要引入Nginx做负载均衡 |高,需要对系统和数据库进行拆分 | 集群方案优
成本 |中,需要增加web服务器 |中,需要增加web服务器和MySQL服务器,单MySQL服务器物流上可以共用,逻辑上分开即可| 集群方案稍微优一点
可扩展 | 低,所有的功能继续在同一个系统实现,系统会越来越复杂,扩展越来越难 | 高,系统按照追责拆分为多个字系统,每个子系统可单独扩展 | 拆分方案优
可用性| 中,web服务器是集群模式,单MySQL是单点的,MySQL故障回你导致整个业务不可用 | 高,子系统是独立的,某个子系统故障不会导致整个业务不可用 | 拆分方案优
> Eg:架构师选择了Elasticsearch作为全文搜索解决方案,前提必须是架构师自己对Elasticsearch的设计原理有深入的理解,比如索引、副本、集群等技术点;而不能道听途说Elasticsearch很牛,所以你选择它,更不能成为把“细节我们不讨论”这句话挂在嘴边的“PPT架构师”。
### 架构设计流程总结:
设计架构的时候,首先要分析出系统的复杂性。
架构师根据自己对业务的理解,挑选合适的架构模式进行组合,再对组合后的方案进行修改和调整。
新技术都是在现有技术的基础上发展起来的,现有技术又源于先前的技术。
备选方案的数量以3~5个备选方案为最佳。
备选方案的差异要比较明显。
备选方案的技术不要只局限于已经熟悉的技术。
通过360度环评的方式来评估备选方案。
按照质量属性的优先级来判断备选方案的优劣。
架构师需要对技术的细节和原理有较深入的理解,避免成为“PPT架构师”。
通过分步骤、分阶段、分系统等方式,尽量降低方案复杂度。
采取设计团队的方式来进行设计,可以博采众长,汇集团队经验,减少思维和经验盲区。
### 存储高性能总结:
- 高性能数据库集群的第一种方式是“读写分离”,其本质是将访问压力分散到集群中的多个节点,但是没有分散存储压力。
- 数据库读写分流需要考虑“复制延迟”带来的复杂性。
- 数据库读写分离的分配机制有两种方式:程序代码封装和中间件封装。
- 高性能数据库集群的第二种方式是“分库分表”,就可以分散访问压力,又可以分散存储压力。
- 业务分库指的是按照业务模块将数据分散到不同的数据库服务器。
- 业务分库会引起join操作问题、事务问题、成本问题三个复杂度相关的问题。
- 数据库分表分为垂直分表和水平分表。
- 垂直分表引入的复杂性主要体现在表操作的数量要增加。
- 水平分表引入了路由、join操作、count()操作、order by操作等复杂度问题。
- K-V存储在数据结构方面相比关系型数据库具备较大优势。
- 文档数据库最大的特点就是no-schema,可以存储和读取任意的数据。
- 列式存储在某些场景下能够大大节省I/O。
- 列式存储具备很高的压缩比,能够节省存储空间。
- 全文搜索引擎的基本源流是倒排索引。
- 为了让全文搜索引擎支持关系型数据的全文搜索,需要做一些转换操作,即将关系型数据转换为文档数据。
- 缓存穿透是指业务系统查询的数据在缓存系统中没有的时候,每次查询都会访问存储系统。
- 缓存雪崩是指当缓存失效(过期)后引起系统性能急剧下降的情况。
- 缓存热点指大部分甚至所有业务请求都命中同一份缓存数据。
### 计算高性能总结:
- RPC模型:每次有新的连接就新建一个进程去专门处理这个连接请求。
- TPC模型:每次有新的连接就新建一个线程去专门处理这个连接的请求。
- Reactor模型的基础是I/O多路复用。
- Proactor模型是非阻塞异步网络模式。
- 常见的负载均衡系统有3种:DNS负载均衡、硬件负载均衡和软件负载均衡。
- 硬件负载均衡用于实现集群级别的负载均衡。
- 软件负载均衡用于实现机器级别的负载均衡。
- 负载均衡算法分为:任务平分类、负载均衡类、性能最优类和Hash类。
### CAP总结:
- CAP理论三个核心要素:一致性、可用性和分区容忍性。
- CAP理论指分布式系统中涉及读写操作时,一致性、可用性、分区容忍性三个要素只能保证两个,另外一个必须被牺牲。
- 分布式系统理论上不可能选择CA架构,只能选择CP或AP架构。
- CAP关注的粒度是数据,而不是整个系统。
- CAP是忽略网络延迟的。
- 正常运行的情况下,不存在CP和AP的选择,可以同时满足CA。
- CAP中放弃某个要素并不等于什么都不做,需要为分区恢复后做准备。
- ACID的应用场景是数据库事务,CAP关注的是分布式系统数据读写。
- BASE是CAP理论中的AP方案的延伸。
### FMEA总结:
- FMEA是一种在各行各业都有广泛应用的可用性分析方法,通过对系统范围内潜在的故障模式加以分析,并按照严重程度进行分类,以确保失效对于系统的最终影响。
- FMEA分析方法很简单,就是一个FMEA分析表。
- FMEA分析中的“功能点”是从用户的角度来看的,而不是从系统各个模块功能点划分来看的。
- FMEA分析中的“故障模式”的描述要尽量精确,多使用量化描述,避免使用泛化的描述。
- FMEA分析中的“严重程序”指站在业务的角度,故障的影响程度一般分为“致命/高/中/低/无“五个档次。
- FMEA分析中不同的”故障原因“发生概率、检测手段和处理措施可能不同。
- FMEA分析中的”风险程度“就是综合严重程度和故障概率来一起判断某个故障的最终等级。
- FMEA分析中不一定所有的问题都要解决,采取规避措施也可以。
### 存储高可用总结:
- 主备架构中的”备机“主要还是起一个备份作用,并不承担实际的业务读写操作。
- 主从架构中的主机负责读写操作,从机只负责读操作,不负责写操作。
- 主备倒换和主从倒换架构的复杂点主要体现在:状态判断、倒换决策和数据冲突修复三方面。
- 主主复制架构必须保证数据能够双向复制,而很多数据是不能双向复制的。
- 根据集群中机器承担的不同角色来划分,集群可以分为两类:数据集中集群、数据分散集群。
- 数据集中集群可以看作一主多备或一主多从,但复杂度比主备或主从要高出很多。
- 数据分散集群中每台服务器都会负责存储一部分数据和同时也会备份一部分数据。
- 数据分区主要应对地理级别的故障。
- 数据分区的复制规则分为集中式、互备式和独立式。
### 计算高可用总结:
- 主备架构时计算高可用最简单的架构,可以细分为冷备结构和温备架构,常用温备架构。
- 计算高可用的主备架构也比较适合与内部管理系统、后台管理系统这类使用人数不多、使用频率不高的业务,不太适合在线的业务。
- 主从架构与主备架构相比,发挥了硬件的性能,但设计要复杂一些。
- 高可用计算的集群根据集群中服务器节点角色的不同,可以分为对称集群和非对称集群。
- 对称集群中每台服务器的角色都是一样的,都可以执行所有任务。
- 非对称集群中的服务器分为多个不同的角色,不同角色执行不同的任务。
- 非对称集群相比负载均衡集群,设计复杂度主要体现在任务分配策略和角色分配策略会更加复杂。
### 业务高可用总结:
- 异地多活架构的关键点就是异地、多活,其中异地就是指地理位置上不同的地方,多活就是指不同地理位置上的系统都能够提供业务服务。
- 异地多活虽然功能很强大,但也不是每个业务不管三七二十一都要上异地多活。
- 如果业务规模很大,能够做异地多活的情况下尽量实现异地多活。
- 异地多活架构可以分为同城异区、跨城异地、跨国异地。
- 异地多活设计技巧:保证核心业务的异地多活、保证核心数据最终以执行、采用多种手段同步数据、只保证绝大部分用户的异地多活。
- 接口级故障的主要应对方案:降级、熔断、限流、排队。
- 降级的核心思想就是丢车保帅,优先保证核心业务。
- 限流指只允许系统能够承受的用户量进来访问,超出系统访问能力的用户将被抛弃。
- 排队实际上是限流的一个变种,限流是直接拒绝用户,排队是让用户等待很长水间。
### 可扩展模式总结:
- 软件系统与硬件和建筑系统最大的差异在于软件是可扩展的。
- 真正有生命力的软件系统都是在不断迭代和发展的。
- 所有可扩展性架构设计,背后的基本思想都可以总结为一个字:拆。
- 面向流程拆分:分层架构
- 面向服务拆分:SOA、微服务。
- 面向功能拆分:微内核架构。
- 不同的拆分方式将得到不同的系统架构。
### 分层架构总结:
- 分层架构是很常见的架构模式,也叫N层架构,通常情况下,N至少是2层,一般不超过5层。
- C/S架构、B/S架构划分的对象是整个业务系统,划分的维度是职责,将不同的职责划分到独立层。
- MVC架构、MVP架构划分的对象是单个业务子系统,划分的维度是职责,将不同的职责划分到独立层。
- 逻辑分层架构划分的对象可以是单个业务子系统,也可以是整个业务系统,划分的维度也是职责。
- 无论采用何种分层维度,分层架构设计最核心的一点就是需要保证各层之间的差异足够清晰,边界足够明显。
- 分层架构之所以能够较好地支撑系统扩展,本质在于:隔离关注点。
- 分层架构的一个特点就是层层传递。
- 分层架构一个典型的缺点就是性能。
### SOA架构总结:
- SOA提出的背景是企业内部的IT系统重复建设且效率低下。
- SOA更多是在传统企业(例如,制造业、金融业等)落地和推广,在互联网行业并没有多大规模的时间和推广。
- SOA三个关键概念:服务、ESB和松耦合。
- SOA架构中,每项业务功能都是一项服务,服务就意味着对外提供开放的能力。
- SOA使用ESB来屏蔽异构系统对外提供各种不同的接口方式,以此来达到服务间高效的互联互通。
- SOA解决了传统IT系统重复建设和扩展效率低的问题,但其本身也引入了更多的复杂性,SOA最广为人诟病的就是ESB。
- SOA的ESB设计也是无奈之举,企业在应用SOA时,各种异构的IT系统都已经踩在很多年了,完全重写或者按照统一标准进行改造的成本是非常大的,只能通过ESB方式其适配已经存在的各种异构系统。
### 微服务架构总结
- 微服务概念的历史要早得多,也不是Martin Flower创造出来的,Martin只是将微服务进行了系统的阐述。
- 微服务是一种和SOA相似但本质上不同的架构理念。
- 微服务的三个关键词 : small(微小的)、lightweight(轻量的)、automated(自动化)。
- 微服务和SOA不存在孰优孰劣,只是应用场景不同。
- 微服务并不是没有代价,而是会带来系统复杂度、运维复杂度、性能下降等问题。
- 微服务拆分的粒度遵循“三个火枪手”原则。
- 真正决定微服务成败的,恰恰是那个被大部分人都忽略的“automated”,而不是“lightweight”和“small”。
- 微服务并不是很多人认为的那样又简单又轻量级,要做好微服务,基础设施是必不可少的。
### 微内核架构总结
- 微内核架构也被称为插件化架构(Plug-in-Architecture),是一种面向功能进行拆分的可扩展性架构。
- 微内核架构通常用于实现基于产品的应用
- 微内核架构包含两类组件:核心系统(core system) 和插件模块(plug-in modules)。
- 微内核的核心系统设计的关键技术有几部分: 插件管理、插件连接和插件通信。
- Eclipse采用OSGi标准后,OSGi更是成为首选的插件化标准。
- 简介
- 更新说明
- 其他作品
- 第一部分 Java框架基础
- 第一章 Java基础
- 多线程实战
- 尝试一下Guava带返回值的多线程处理类ListenableFuture
- LocalDate和Date有什么区别
- JAVA8接口增强实践
- 第二章 Spring框架基础
- MVC究竟是个啥?
- @ApiImplicitParam
- 七种方式,教你在SpringBoot初始化时搞点事情!
- Spring事务状态
- maven
- Mybatis小总结
- mybatis-plus的使用
- 第三章 SpringSecurity实战
- 基于SpringSecurity+jwt的用户认证
- spring-security-oauth2
- 第四章 数据库
- mysql
- mysql授权
- mysql数据库三个关键性能指标--TPS\QPS\IOPS
- 梳理一下那些年Mysql的弱语法可能会踩的坑
- 关于Mysql的“字符串”数值的转换和使用
- 凭这一文咱把事务讲透
- Mysql性能优化
- 查询性能优化
- 不常用的一些语法
- elasticsearch
- elasticsearch文档操作
- 索引的基本操作
- java操作ElaticSearch
- elasticsearch中的各种查询
- DB与ES混合应用可能存在的问题及解决方案探索
- 使用es必须要知道的一些知识点:索引篇
- Es中的日期操作
- MongoDB
- 入门篇(了解非关系型数据库 NoSQL - MongoDB)
- 集群分片 (高级篇)
- 互联网大厂的建表规范
- 第五章 中间件
- nginx
- nginx动静分离配置,这个雷你踩过吗?
- Canal
- Sharding-jdbc
- 水平分库实践
- kafka
- 第六章 版本管理
- git
- Not currently on any branch 情况提交版本
- 第七章 IO编程
- 第八章 JVM实战调优
- jvisualvm
- jstat
- 第二部分 高级项目实战篇
- 第一章 微信开发实战
- 第二章 文件处理
- 使用EasyExcel处理导入导出
- 第三章 踩坑指南
- 邮件发送功能
- 第三部分 架构实战篇
- 第一章 架构实战原则
- 接口防止重复调用的一种方案
- 第二章 高并发缓存一致性管理办法
- 第三章 异地多活场景下的数据同步之道
- 第四章 用户体系
- 集成登录
- auth-sso的管理
- 第五章 分库分表场景
- 第六章 秒杀与高并发
- 秒杀场景
- 第七章 业务中台
- 中台的使用效果是怎样的?
- 通用黑白名单方案
- 第八章 领域驱动设计
- 第十一章 微服务实战
- Nacos多环境管理之道
- logback日志双写问题及Springboot项目正确的启动方式
- 第四部分 优雅的代码
- java中的链式编程
- 面向对象
- 开发原则
- Stream操作案例分享
- 注重性能的代码
- 第五部分 谈谈成长
- 新手入门指北
- 不可不知的调试技巧
- 构建自己的知识体系
- 我是如何做笔记的
- 有效的提问
- 谨防思维定势
- 学会与上级沟通
- 想清楚再去做
- 碎片化学习
- 第六部分 思维导图(付费)
- 技术基础篇
- 技术框架篇
- 数据存储篇
- 项目实战篇
- 第七部分 吾爱开源
- 7-1 麻雀聊天
- 项目启动
- 前端登录无请求问题解决
- websocket测试
- 7-2 ocp微服务框架
- evm框架集成
- 项目构建与集成
- zentao-center
- 二次开发:初始框架的搭建
- 二次开发:增加细分菜单、权限到应用
- 7-3 书栈网
- 项目启动
- 源码分析
- 我的书架
- 文章发布机制
- IM
- 第八章 团队管理篇
- 大厂是怎么运作的
- 第九章 码山有道
- 简历内推
- 联系我内推
- 第十章 学点前端
- Vue