从0开始学架构
李运华老师(从0开始学架构)学习笔记
什么是架构
架构的定义可以按不同的角度去诠释:
- 从业务角度 :erp的采购模块、发票模块、商品模块
- 从物理部署角度 :nginx;mysql;web服务器
- 从开发规范角度:MVC框架:model、view、controller
架构设计的目的
解决软件系统复杂度带来的问题 :分析系统的复杂度在哪,并通过架构设计来解决
复杂度的来源
高性能
单机高性能
要实现单机的高性能通常要考虑的是多线程并发技术,保证cpu的运行效率
多机高性能
任务分配
多台机器实现高性能,第一个复杂度就是怎么实现任务分配

任务分配器比如是nginx。
要考虑的点:任务分配的算法;任务分配器和业务服务器断开连接了怎么办。

业务请求再次增加,任务分配器也需要增多,采用DNS轮询(将相同域名映射到不同ip地址)将请求打到不同的任务分配器。复杂度再次增加。
任务分解
光靠扩充机器,来实现高性能是不够的,业务越复杂,单台机器的性能就越差。需要将系统的功能变简单进而提升性能。复杂系统变简单系统就需要任务分解,任务分解就会带来复杂度。
任务分解的复杂度主要体现在,改怎么分?分的越细越好么?
高可用
高可用是指,不管发生什么事情,系统都能够对外提供服务,要做到这点,就需要冗余
复杂度来源
计算高可用

- 选什么任务分配器
- 连接断开怎么处理(任务分配器和计算服务器)
- 分配算法是什么
存储高可用
存储高可用的主要复杂度体现在:如何减少或者规避数据不一致对业务造成的影响

可扩展
复杂度来源一:预测变化
现在用的mysql,预测以后要用Oracle,这种是不好预测出来的
复杂度来源二:应对变化
即使能够预测到变化,应对变化也是复杂的。
- 需要划分出哪个是稳定层,哪个是变化层
- 需要设计稳定层和变化层之间的接口。(采用设计模式)
架构设计三原则
合适原则
架构设计要适合自己的业务需求,规模小就不要做什么抗住亿级并发的系统
简单原则
演化原则
演化优于一步到位
架构设计流程
识别复杂度
切入点是高性能、高可用、可扩展,然后按优先级排序,优先级最高的最先去解决
设计备选方案
针对识别出的复杂度,设计多个备选方案,但不需要详细设计,从中选择一个合适的
详细方案设计
选择出合适的方案后,针对这个方案进行详细设计
架构设计流程
高性能解决方案
高性能数据库集群
读写分离
复制延迟
- 写操作后的读操作指定主机(不建议,新来的程序员可能不知道)
- 读从机没有则去主机读(主机可能禁受不住而崩溃)
- 关键业务全部指向主机
分配机制
- 代码分配:采用shardingsphere来分库分表
- 中间件封装

分库分表
高性能缓存
关系型数据库不能存储数据结构,并且IO效率差,查询速度慢,采用缓存来解决
高性能负载均衡

- DNS负载均衡
- F5负载均衡
- nginx负载均衡
高可用解决方案
存储高可用
主备复制
优点:简单 缺点:备机只是备份作用,比较浪费;主机故障需要人工干预设置备机为主机
主从复制
优点:简单 缺点:需要人工干预设置从机为主机
双机切换
解决上述架构都需要人工干预的问题
互联式

主机同步数据的同时,同步状态,状态同步失败,则备机自动提升为主机
中介式

模拟式
备机模拟成客户端向主机发送请求

主主复制

适合于那些临时性、可丢失、可覆盖的数据场景。例如,用户登录产生的 session 数据(可以重新登录生成)、用户行为的日志数据(可以丢失)、论坛的草稿数据(可以丢失)等
数据分区
集中式

互备式

独立式

计算高可用
本质上还是通过冗余来实现高可用,并利用负载均衡算法,将请求打到不同的机器上
业务高可用
采用异地多活,洲、国、区、城(敏感数据不异地多活,方式数据不一致导致出现问题)
可扩展解决方案
拆!
面向流程拆

面向服务拆

436

被折叠的 条评论
为什么被折叠?



