架构设计方法论沉淀

2021-09-03 20:53:08 浏览数 (1)

1.概述

架构设计的主要目的: 解决软件系统复杂度带来的问题。

架构设计复杂度的来源: 高性能、高可用、高可扩展以及低成本.

架构设计的原则:合适、简单、演化.

架构设计流程:识别系统复杂度->设计备选方案->评估和选择备选方案->详细方案设计

2.容量评估

这是架构设计的基本功,什么样的场景需要进行容量预估、容量设计呢?

(1)容量有质变性增长

(2)临时运营活动(如双11,春节红包)

(3)新系统上线

评估哪些指标?

看具体业务,对应到系统测的主要矛盾是什么?例如:

(1)数据量 (新鲜事评论, 视频点播平台)

(2)并发量,吞吐量(12306抢票,商品抢购)

(3)带宽(直播,推流,音视频业务)

(4)CPU/MEM/DISK IO等

如何进行容量评估?(QPS吞吐量)

1). 评估总访问量:参考产品品和运营预估数据

2). 评估平均吞吐量:总访问量/总时间,一天按4W秒(一天总共60x60x24=86400秒;一般认为请求都发生在白天即4W秒)

3). 评估高峰吞吐量:根据业务访问曲线来评估(二八原则,秒杀等特殊业务除外)

4). 评估单机极限吞吐量:压测

5). 根据线上冗余度做决策:计算需求与线上冗余差值(灾备)

3.高性能

1). 高性能常见指标

1. 响应时间(Response Time)

2. 吞吐量(Throughput)

3. 每秒查询率QPS(Query Per Second)

4. 并发用户数

2).提升系统性能的方法:

1. 垂直扩展(Scale Up) 增强单集硬件性能,提升单集架构性能

2. 水平扩展(Scale Out) 只要增加机器数量,就能线性扩展系统性能 每一层都必须支持水平扩展, 才能理论上性能无限.

3) .常用方法: 读写分离, 动静分离(页面静态化),数据库水平切分(水平分表、分库),高性能缓存架构, CDN加速.

CDN适合静态资源的加速访问:通过“智能DNS”来实现的!智能DNS通过用户ip来解析域名实现就近访问

4)缓存架构

进程内缓存可以节省内网带宽 并且 时延更低, 但保证数据一致性 复杂性很高.且违背了””服务无状态”的设计准则,数据和状态尽量存储到后端统一存储.

什么时候可以使用进程内缓存?

1. 只读数据

2. 并发极高,透传后端压力极大 (秒杀类业务)

3. 允许一定程度上数据不一致 (计数业务)

如何保证进程内缓存的一致性?

方案一:单节点通知其他节点

同一功能在一个集群的多个节点相互耦合在一起,节点比较多时,连接关系会比较复杂

方案二:MQ解耦合,但引入MQ系统复杂性提高

方案三:放弃实时一致性,定期从后端更新数据

4.高可用

Cap理论

高可用HA(High Avaliability),是分布式系统架构设计必须考虑的因素,如何保障系统的高可用?

(1)集群化(冗余)

(2)故障自动转移

高可用存储架构:双机架构

高可用存储架构:集群和分区

业务高可用的保障:异地多活架构

主从一致性,究竟如何解决?

主从不一致发生原因:写请求发生后,数据还没同步到从库,立刻发生读请求(主从同步时延)

主从数据冗余,主从不一致:

1. 忽略不计(业务接受很短的时延内读到老数据)

2. 强制读主(放弃读写分离,一主多从的分组架构;使用缓存来提升读性能,引入缓存与数据库的数据不一致问题)

3. 借助缓存,选着性读主(主从同步的时延范围内读主库,否则读冲库,缓存记录写的数据库,表,主键)

主主不一致发生原因:主库使用自增长主键;两个主库同时发生写请求,自增主键冲突,同步失败,造成数据永久性丢失

主主数据冗余,主主不一致:

1. 数据库自增id设置不同初始值,相同增长步长

2. 应用层生成不冲突的id (雪花算法等)

3. 只有一个主库提供服务,影子主不服务(牺牲资源利用率,数据一致性与资源利用率的折中)

5.高可扩展

可扩展的基本思想:拆分. 就是将原本大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,无须整个系统到处都改,通过这种方式来减少改动范围,降低改动风险。

按照不同的思路来拆分软件系统,就会得到不同的架构。常见的拆分思路有如下三种,不同的拆分方式,将得到不同的系统架构:

面向流程拆分:分层架构。将整个业务流程拆分为几个阶段,每个阶段作为一部分。

面向服务拆分:SOA、微服务。将系统提供的服务拆分,每个服务作为一部分。

面向功能拆分:微内核架构。将系统提供的功能拆分,每个功能作为一部分。

架构分层方法论:

(1)分层架构,是一个“数据移动”,被“处理”,然后被“呈现”的过程

(2)架构分层方法论:

让上游更高效的获取与处理数据,复用

让下游能屏蔽数据的获取细节,封装

MQ (消息总线,Message queue)是互联网架构中最常见的结构利器

6.微服务

服务化有什么好处:

1. 复用性,消除代码拷贝2. 专注性,防止复杂性扩散

3. 解耦合,消除公共库耦合

4. 高质量,SQL稳定性有保障

5. 易扩展,消除数据库解耦合

6. 高效率,调用方研发效率提升

但是如果服务化不合理,将个性化的数据下沉到了底层的微服务,耦合和瓶颈会更加严重。

如何解耦: 个性化代码上浮,公共代码下沉,服务化更彻底!

0 人点赞