07 架构初探 | 青训营笔记

120 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第8天

讲师: 兰新宇

PPT: bytedance.feishu.cn/file/boxcnu…

资料: juejin.cn/course/byte…

C10K问题 www.kegel.com/c10k.html

01 什么是架构

架构, 又称软件架构
是有关软件整体结构与组件的抽象描述
用于指导软件系统各个方面的设计
通俗理解: 实现一个软件有多种方法, 架构在方法选择上起至关重要的指导作用

单机

就是把所有功能都实现在一个进程里, 并部署在一台机器上
优点:
简单
问题:
C10K problem
运维需要停服

单体, 垂直应用

单体架构: 分布式部署
垂直应用架构: 按应用垂直划分的单体
优点:
水平扩容
运维不需要停服
问题:
职责太多, 开发效率不高
爆炸半径大

SOA, 微服务

SOA(Service-Oriented Architecture)
将应用的不同功能单元抽象为服务
定义服务之间的通信标准
微服务架构: SOA的去中心化演进方向
问题:
数据一致性
高可用 (如何各服务合作)
治理 (如何容灾)
解耦 vs 过微 (运营成本提高是否值得)

02 企业级后端架构剖析

云计算

云计算: 通过软件自动化管理, 提供计算资源的服务网络, 是现代互联网大规模熟悉分析和存储的基石
基础:
虚拟化技术
编排方案
架构:
IaaS (Infrastructure as a Service)
PaaS (Platform as a Service)
SaaS (Software as a Service)
FaaS (Function as a Service)

云原生

Cloud Native

云原生技术为组织(公司)在公有云, 自由云, 混合云等新型的动态环境中, 构建和运行可弹性拓展的应用提供了可能
弹性资源:
虚拟化容器
快速扩缩容
微服务架构:
业务功能单元解耦
统一的通信标准
DevOps:
敏捷开发
CI/CD (CI: continuous integration持续集成, CD: continuous delivery/deployment代码持续交付/部署)
服务网格:
业务与治理解构
异构系统的治理统一化   复杂治理能力

弹性资源

弹性计算资源类型:
服务资源调度
微服务
大服务
计算资源调度
在线: 如热销榜单
离线: 如热销榜单更新
消息队列
在线: 削峰, 解耦
离线: 大数据分析

弹性存储资源类型:
经典
对象: 如宣传视频
大数据: 如用户消费记录
关系型数据库
如收银记录
元数据
服务发现: 如蛋糕店通讯录
NoSQL
KV (key-value)
总结: 将存储资源当成服务

DevOps

DevOps是云原生时代软件交付的利器, 贯穿整个软件开发周期
结合自动化流程, 提高软件开发, 交付效率

微服务架构

通信标准
HTTP(RESTful API)
RPC(Thrift, gRPC)
微服务中间件RPC vs HTTP
性能
服务治理
协议可解释性
云原生场景下, 微服务大可不必在业务逻辑中实现符合通信标准的交互逻辑, 而是交给框架来做

服务网格

服务网格(Service Mesh)
微服务之间通讯的中间层
高性能网格代理
业务代码与治理解耦
相比较RPC/HTTP框架
异构系统治理统一化
与业务进程解耦, 生命周期易管理

03 企业级后端架构的挑战

挑战:
基础设施层面
物理资源有限
机器
带宽
资源利用率受制于部署服务
用户层面
网络通信开销较大
网络抖动导致运维成本提高
异构环境下, 不同实例资源水位不均

离在线资源并池

核心收益:
降低物理资源成本
提供更多的弹性资源, 增加收入
解决思路: 离在线资源并池
在线业务特点:
IO密集型为主
潮汐性, 实时性
离线业务特点:
计算密集型占多数
非实时性

自动扩缩容

核心收益:
降低业务成本
解决思路: 自动扩缩容
利用在线业务潮汐性自动扩缩容

微服务亲和性部署

核心收益:
降低业务成本
提高服务可用性
解决思路: 微服务亲和性部署
将满足亲和性条件的容器调度到一台宿主机
微服务中间件与服务网格通过共享内存通信
服务网格控制面实施灵活, 动态的流量调度

流量治理

核心收益
提高微服务调用容错性
容灾
进一步提高开发效率, DevOps发挥到极致
解决思路: 基于微服务中间件和服务网格的流量治理
熔断, 重试
单元化
复杂环境(功能, 预览)的流量调度

CPU水位负载均衡

核心收益:
打平异构环境算力差异
为自动扩缩容提供正向输入
解决思路: CPU水位负载均衡
IaaS
提供资源探针
服务网格
动态负载均衡

04 后端架构实战

CPU水位负载均衡, 应该如何设计

CPU水位负载均衡, 应该如何设计
需要哪些输入
设计时需要考虑哪些关键点
输入:
服务网格数据面
支持带权重的负载均衡策略
注册中心存储了所有容器的权重信息
宿主技能提供
容器的资源使用情况
物理资源信息(如CPU 型号)
关键点:
紧急回滚能力
大规模
极端场景

服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务

自适应静态权重

 方案:
     采集宿主物理资源信息
     调整容器注册的权重
 优势:
     复杂度低
     完全分布式, 可用性高
     微服务中间件无适配成本
 缺点:
     无紧急回滚能力
     缺乏运行时自适应能力

自适应动态权重Alpha

 方案:
     容器动态权重的自适应调整
     服务网格的服务发现&流量调度能力
 演进方向:
     解决无法紧急回滚的问题
     运行时权重自适应
 缺点:
     过度流量倾斜可能有异常情况

自适应动态权重Beta

 方案: 
     服务网格上报RPC指标
 演进方向:
     极端场景的处理成为可能
 缺点:
     时序数据库压力较大
     动态权重决策中心职责越来越多, 迭代->变更->风险

自适应动态权重 Release

 演进方向:
     微服务化
     引入消息队列削峰, 解耦
     离在线链路切分
     梳理强弱依赖

尾声

 1 没有最好的架构, 只有最合适的架构
 2 如何做架构设计
     需求先行: 弄清要解决什么问题
     业界调研: 业界有哪些解决方案可供参考
     技术选型: 内部/社区都有哪些基础组件
     异常情况: 考虑清楚xxx无法工作了如何解决
 3 架构与工程师成长
     技术经理
     架构师