这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
Day10——架构初探
01.什么是架构
定义
架构,又称软件架构,是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计
通俗的说就是实现一个软件在方法选择上的指导
单机架构
软件系统需要具备对外提供服务,单机,就是把所有功能都实现在一个进程里,并部署在一台机器上
比如开蛋糕店自己作师傅,一个人打理
优点是简单
缺点是运维需要停服
单体、垂直应用/垂直切分
单体架构:分布式部署
可以类比成多请几个蛋糕师傅
垂直应用框架:按应用垂直切分的单体
比如按做蛋糕的类型请多个师傅
优点:水平扩容,运维不需要停服
问题:职责太多,开发效率不高,爆炸半径大
SOA,微服务/水平切分
SOA (Service-Or iented Architecture)
1.将应用的不同功能单元抽象为服务
2.定义服务之间的通信标准
微服务架构:SOA的去中心化演进方向
以服务为中心,整个架构都面向服务,让服务间产生交互与沟通
如图沟通技巧部分显然需要频繁交互,是中心,而微服务在逐渐去中心化
需要解决的问题:
1.数据一致性问题,统计卖出蛋糕的个数
2.高可用,许多的蛋糕师傅如何高效合作
3.治理,假如烤箱坏了,如何容灾
4.解耦和过微的问题,平衡耦合和过度微小的问题
02.企业级后端架构剖析
背景:
根据这个实际的问题可以映射企业级架构
云计算
云计算:是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模熟悉分析和存储的基石。
基础:
虚拟化技术–整租(整个机器都自己用)vs合租(许多人一起用这几台虚拟机)
编排方案–业主vs租赁平台
架构:
laas ( lnfrastructure as a Service)
买房子vs房屋租赁平台
PaaS (Platform as a Service) 清包vs全包(自己装修,外包装修)
Saas (Software as a Service)
从零培训vs雇佣培训过的师傅(不使用云计算提供的功能,使用云计算)
FaaS (Function as a Service)
纯手工制作vs蛋糕机批量生产(使用云计算就如同批量生产蛋糕)
如果使用云计算,可以使我们更加专注于业务开发,而不是底层细节
云原生
云原生技术为组织(公司〉在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。
弹性计算资源类型:
1.服务资源调度 微服务:和面、雕花
大服务:烤箱 2.计算资源调度 在线:热销榜单
离线:热销榜单更新
3.消息队列 在线:削峰处理海量数据削峰、解耦
离线:大数据分析
弹性存储资源类型:
1.经典
对象存储:宣传视频
大数存储据:用户消费记录
2.关系型数据库
收银记录
3.元数据
服务发现:蛋糕店通讯录,师傅,用户都住在哪里,电话号码是什么
4.NoSQL
KV(key-value):来个xx蛋糕
Devops
Dev0ps是云原生时代软件交付的利器,贯穿整个软件开发周期。结合自动化流程,提高软件开发、交付效率
微服务架构
通信标准:
- HTTP (RESTful API)
- RPC (Thrift,gRPC)
在微服务中间件的选择上可以考虑以下几个方面
1.性能
一般情况RPC会比HTTP的性能要好一些
2.服务治理
对于一些RPC中间件天生有服务治理的性质
3.协议可解释性
RPC有很多压缩方案,HTTP绝大多数json,有很好的解释性
云原生场景下,微服务大可不必在业务逻辑中实现符合通信标准的交互逻辑,而是交给框架来做
服务网格
服务网格(Service Mesh):
- 微服务之间通讯的中间层
- 高性能网络代理
- 业务代码与治理解耦
相比较于RPC/HTTP框架
- 异构系统治理统一化
- 与业务进程解耦,生命周期易管理
容器可以看成虚拟化机器,此处只观察数据流 即可
根据以上知识,可以对蛋糕店进行架构设计:
03.企业级后端架构的挑战
问题
基础设施层面:
1.物理资源是有限的:机器,带宽
2.资源利用率受制于部署服务,比如有很多buffer的资源是可以利用的
用户层面:
1.网络通信开销较大
2.网络抖动导致运维成本提高
3.异构环境下,不同实例资源水位不均
离,在线资源并池
核心收益:降低物理资源成本,提供更多的弹性资源,增加收入
解决思路:离在线资源并池
在线业务的特点:IO密集型为主,潮汐性、实时性
离线业务的特点:计算密集型占多数(做数据分析等),非实时性
下面是并池模型:
可以应对一些潮汐
同一个机器可以用虚拟化技术对离在线进程隔离
自动扩缩容
核心收益:降低业务成本
解决思路:自动扩缩容,利用在线业务潮汐性自动扩缩容
当不需要很多资源时,可以进行缩容,需要资源时进行扩容
这样在闲时资源量就变多了,也可以让在线资源得到充分利用
扩缩容依据指标:主要以cpu分位数,也会以内存作为依据
对于IO为指标进行扩缩容,目前还有很大难度
微服务亲和性部署
核心收益:降低业务成本(序列化反序列化成本等),提高服务可用性
解决思路:微服务亲合性部署
将满足亲合性条件的容器调度到一台宿主机,微服务中间件与服务网格通过共享内存通信,服务网格控制面实施灵活、动态的流量调度
会充分利用服务网格的控制面的流量调度
流量治理
核心收益:提高微服务调用容错性,容灾,进一步提高开发效率,Dev0ps发挥到极致
解决思路:基于微服务中间件&服务网格的流量治理
- 熔断、重试
- 单元化
- 复杂环境(功能、预览)的流量调度
CPU水位负载均衡
核心收益:打平异构环境算力差异,为自动扩缩容提供正向输入
解决思路:CPU水位负载均衡
- laaS:提供资源探针
- 服务网格:动态负载均衡
比如两个B容器CPU能力不同,可以根据两个B容器资源能力进行负载均衡
04.后端架构实战
问题背景:
不同师傅的效率不同,有些师傅希望多干多挣钱,有些能力差的完不成任务,想少干一些
这就是是CPU水位负载均衡的设计
问题提炼
输入:
1.服务网格数据面:支持带权重的负载均衡策略
2.注册中心存储了所有容器的权重信息
3.宿主机能提供:容器的资源使用情况,物理资源信息(如CPU型号)
关键点:
紧急回滚能力,大规模(系统稳定性),极端场景
方案:自适应静态权重
方案:采集宿主机物理资源信息,调整容器注册的权重
优势:复杂度低,完全分布式,可用性,高微服务中间件无适配成本
缺点:无紧急回滚能力(比如权重改错了),缺乏运行时自适应能力(比如CPU能力变化,无法动态调整)
方案:自适应动态权重1
方案:容器动态权重的自适应调整,服务网格的服务发现&流量调度能力
演进方向:解决无法紧急回滚的问题,运行时权重自适应
缺点:过度流量倾斜可能会有异常情况,就是大权重容器出现问题,会造成大流量请求失败
如果动态权重出现问题,会紧急切换到静态权重
方案:自适应动态权重2
方案:服务网格上报 RPC指标
演进方向:极端场景的处理成为可能
缺点:时序数据库压力较大,动态权重决策中心职责越来越多,迭代→>变更→>风险
时刻检测RPC指标,防止过于突变,导致流量倾斜
方案:自适应动态权重(最终版)
演进方向:微服务化,引入消息队列削峰、解耦,离在线链路切分,梳理强弱依赖
小结:
- 没有最好的架构,只有最合适的架构,要根据实际设计,一开始不要过度设计
- 业界调查,查找可行方案
- 技术选型,看内部和社区有哪些基础组件
- 异常情况怎么办