这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记
01 什么是架构
定义
架构,又称软件架构
- 是有关软件整体结构与组件的抽象描述
- 用于指导软件系统各个方面的设计
单机
软件系统需要具备对外提供服务,单机,就是把所有功能都实现在一个进程里,并部署在一台机器上
优点:简单
问题:
- C10K problem
- 运维需要停服
如何卖更多蛋糕?
- 雇更多蛋糕师傅
单体、垂直应用|垂直切分
单体架构:分布式部署 垂直应用架构:按应用垂直切分的单体 优点:
- 水平扩容
- 运维不需要停服
问题:
- 职责太多,开发效率不高
- 爆炸半径大
如何提高做蛋糕效率?
- 分工协调
SOA、微服务|水平切分
SOA(Service-Oriented Architecture)
- 将应用的不同功能单元抽象为服务
- 定义服务之间的通信标准
微服务架构:SDA 的去中心化演进方向
问题:
-
数据—致性
- 装货台共交付了多少蛋糕?
-
高可用
- 这么多师傅,如何合作?
-
治理
- 烤箱坏了,怎么容灾?
-
解耦 vs 过微
- 运维成本高了,值当么?
总结
- 需求量越来越大,终归要增加人手
- 越做越复杂,终归要分工合作
02 企业级后端架构剖析
云计算
是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模熟悉分析和存储的基石。
基础:
- 虚拟化技术-整租 vs 合租
- 编排方案-业主 vs 租赁平台
架构:
-
laaS (Infrastructure as a Service)
- 买房子 vs 房屋租赁平台
-
PaaS (Platform as a Service)
- 清包 vs 全包
-
SaaS (Software as a Service)
- 从零培训 vs 雇佣培训过的师傅
-
FaaS (Function as a Service)
- 纯手工制作 vs 蛋糕机批量生产
云原生
云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。
云原生之弹性计算资源
弹性计算资源类型:
-
服务资源调度
- 微服务:和面、雕花
- 大服务:烤箱
-
计算资源调度
- 在线:热销榜单
- 离线:热销榜单更新
-
消息队列
- 在线:削峰、解耦
- 离线:大数据分析
云原生之弹性存储资源
弹性存储资源类型:
-
经典存储
- 对象存储 - 视频、图片等。结合 CDN 等技术,可以为应用提供丰富的多媒体能力
- 大数据存储 - 应用日志、用户数据等。结合数据挖掘、机器学习等技术,提高应用的体验
-
关系型数据库
-
元数据
- 服务发现
-
NoSQL
- KV 存储 - Redis
- 文档存储 - Mongo
在云原生的大背景下,不论是计算资源还是存储资源,他们都像是服务一样供用户使用。
云原生之DevOps
DevOps是云原生时代软件交付的利器,贯穿整个软件开发周期。
结合自动化流程,提高软件开发、交付效率
云原生之微服务架构
微服务架构下,服务之间的通讯标准是基于协议而不是 ESB 的。
通信标准:
- HTTP(RESTful API)
- RPC(Thrift, gRPC)
微服务中间件 RPC vs HTTP:
- 性能
- 服务治理
- 协议可解释性
云原生场景下,微服务大可不必在业务逻辑中实现符合通信标准的交互逻辑,而是交给框架来做。
如何在 HTTP 和 RPC 之间选择?
- 性能 - RPC 协议往往具备较好的压缩率,性能较高。如 Thrift, Protocol Buffers
- 服务治理 - RPC 中间件往往集成了丰富的服务治理能力。如 熔断、降级、超时等
- 可解释性 - HTTP 通信的协议往往首选 JSON,可解释性、可调试性更好
云原生之服务网格
服务网格(Service Mesh):
- 微服务之间通讯的中间层
- 一个高性能的 4 层网络代理
- 将流量层面的逻辑与业务进程解耦
没有什么是加一层代理解决不了的问题,服务网格相比较于 RPC/HTTP 框架:
- 实现了异构系统治理体验的统一化
- 服务网格的数据平面代理与业务进程采取进程间通信的模式,使得流量相关的逻辑(包含治理)与业务进程解耦,生命周期也更容易管理
03 企业级后端架构的挑战
问题
挑战:
-
基础设施层面
-
物理资源是有限的
- 机器
- 带宽
-
资源利用率受制于部署服务
-
-
用户层面
- 网络通信开销较大
- 网络抖动导致运维成本提高
- 异构环境下,不同实例资源水位不均
离在线资源并池
核心收益:
- 降低物理资源成本
- 提供更多的弹性资源,增加收入
解决思路:离在线资源并池
-
在线业务的特点
- IO密集型为主
- 潮汐性、实时性
-
离线业务的特点
- 计算密集型占多数
- 非实时性
同一个机器怎么做离在线隔离?
- 离线资源用离线进程,在线资源用在线进程,用 Cgroup、虚拟化的方式,对cpu的核心做隔离,使不同的任务使用不同的cpu set(离线的用离线的,在线的用在线的),尽可能做到在cpu资源上互不影响,达到隔离效果。
自动扩缩容
核心收益:
- 降低业务成本
解决思路:
-
自动扩缩容
- 利用在线业务潮汐性自动扩缩容
扩缩容依据什么指标?
- 对于很多微服务,内存使用不高,会使用cpu的某一个统计的分位数
- 有内存要求的,也可以看内存利用率
微服务亲和性部署
亲合性部署,通过将微服务调用形态与资源调度系统结合,将一些调用关系紧密、通信量大的服务部署在同一个机器上,并且使用 IPC 代替 RPC 的方式,降低网络通信带来的开销。
核心收益:
- 降低业务成本
- 提高服务可用性
解决思路:微服务亲合性部署
- 将满足亲合性条件的容器调度到一台宿主机
- 微服务中间件与服务网格通过共享内存通信
- 服务网格控制面实施灵活、动态的流量调度
流量治理
核心收益:
- 提高微服务调用容错性
- 容灾
- 进一步提高开发效率,DevOps 发挥到极致
解决思路:基于微服务中间件&服务网格的流量治理
- 熔断、重试
- 单元化
- 复杂环境(功能、预览)的流量调度
CPU水位负载均衡
核心收益:
- 打平异构环境算力差异
- 为自动扩缩容提供正向输入
解决思路:CPU 水位负载均衡
-
Iaas
- 提供资源探针
-
服务网格
- 动态负载均衡
04 后端架构实战
自适应静态权重
方案:
- 采集宿主机物理资源信息
- 调整容器注册的权重
优势:
- 复杂度低
- 完全分布式,可用性高
- 微服务中间件无适配成本
缺点:
- 无紧急回滚能力
- 缺乏运行时自适应能力
自适应动态权重
方案:
- 容器动态权重的自适应调整
- 服务网格的服务发现&流量调度能力
- 服务网格上报 RPC 指标