这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
学员手册: 【网络与部署学习资料(下)】第三届字节跳动青训营 - 后端专场 - 掘金 (juejin.cn)
本课程的包含以下四个方面:
-
什么是架构
- 围绕架构的定义和演进两部分内容展开
-
企业级后端架构剖析
- 详细介绍企业级后端架构的形态
-
企业级后端架构的挑战
- 企业级架构都面临着哪些挑战,如何解决
-
后端架构实战
- 结合前三部分的知识点,以第三部分中的一个挑战为例,讲解如何做架构设计
什么是架构
常见软件架构:
- 单机
- 优点:简单
- 缺点:c10K 问题(服务器如何承载10k个并发连接,承载能力有限);运维需要停服
- 演进: 如何卖更多蛋糕?更多的工人
- 单体
- 分布式部署,复制进程到多个机器上,并行工作
- 垂直应用
- 按应用垂直切分的单体(拆成几个功能互不相干的软件,之间没有沟通)
- 优点:水平扩容;运维不需要停服
- 缺点:职责多导致开发效率不高;爆炸半径仍旧较大
- 演进:如何提高做蛋糕的效率?分工协作
- SOA (Service Oriented Architecture,面向服务架构)
- 定义:1.将应用不同功能单元抽象为服务;2.定义不同服务之间的通信标准
- 缺点:ESB (企业服务总线) 往往需要一整套解决方案
- 微服务 (Microservice)
- SOA的去中心化演进方向。在 SOA 架构中,ESB 起到了至关重要的作用。但从架构拓扑来看,它更像是一个集中式的模块。有一个 SOA 分布式演进的分支,最终的形态便是微服务。
- 问题:数据一致性;高可用;治理、容灾;解耦过细导致运维成本上升
如何给架构下定义
- 有关软件整体结构和组件的抽象描述
- 用于指导软件系统各个方面的设计 通俗讲,架构在软件实现的方法选择上提供指导作用
架构的重要性
- 地基牢固
- 盖得更高
- 看的更远
企业级后端架构剖析
云计算
基础:
- 虚拟化技术
- 编排方案
架构:
- IaaS
- PaaS
- SaaS
- FaaS
云原生
在公有云、自由云、混合云等新型动态环境中,构建和运行可弹性拓展的应用
弹性计算资源
- 服务资源调度
- 微服务(资源需求少)
- 大服务(资源需求大)
- 计算资源调度
- 在线(需要快速的资源响应)
- 离线(动态更新,资源响应可以放缓)
- 消息队列
- 在线:削峰、解耦
- 离线:大数据分析
弹性存储资源
- 经典
- 对象存储,例如宣传视频
- 大数据,例如用户消费记录
- 关系型数据库
- 收银记录,选课记录等等
- 元数据
- 数据量不大但是比较关键描述性数据,比如服务发现:蛋糕店通讯录
- NoSQL
- KV数据库
- 文档数据库 总结:将存储资源当成服务一样
DevOps
软件交付的工具,贯穿软件开发周期
自动化流程,提高开发、交付的效率
微服务架构
通信(其实不太准确把这两个并列来比,RPC可能和Restful来比较更合适):
- HTTP
- RPC
如何选择?
- 性能(RPC性能好,HTTP可解释性好)
- 服务治理
- 协议可解释性
一般负载均衡到API服务使用HTTP,从API服务往后开始使用RPC
服务网格
- 微服务之间通讯的中间层
- 高性能网络代理
- 业务代码与治理解耦
和RPC/HTTP框架比较:
- 异构系统治理统一化
- 与业务进程解耦,生命周期易管理 下图中的service mesh 就是服务网格
企业级后端架构挑战
挑战:
- 基础设施层面
- 物理资源有限
- 资源利用率受限于部署服务(看起来都被部署占用了,但部分资源没有使用)
- 用户层面
- 网络通信开销大
- 网络抖动增加运维成本
- 异构环境下不同实例资源水位不均(不同物理机器的CPU能力可能不一样)
离在线资源并池
核心受益:
- 降低物理资源成本
- 提供更多弹性资源
在线资源池:高可用、高并发服务
离线资源池:数据分析
在线业务特点:
- IO密集型为主
- 潮汐性、实时性 离线业务特点:
- 计算密集型占多数
- 非实时性
策略:将两个资源池合并,根据一天中不同时间段的业务流量特点,两个资源池的占比动态分配。例如白天多在线,凌晨多离线。
问题:同一个机器怎么做离在线隔离? 用虚拟化技术、cgroup,对CPU做隔离,互不影响
自动扩缩容
核心受益:降低业务成本
利用在线业务潮汐性自动扩缩容
问题:扩缩容指标?一般使用CPU和内存利用率,基于IO和业务QPS等比较困难,或者可行性不好。
微服务亲和性部署
核心受益:
- 降低业务成本
- 提高服务可用性 什么是亲和性呢?例如两个容器之间通信频繁,那么可以考虑编排到一台机器上。
流量治理
核心受益:
- 提高微服务调用容错
- 容灾
- 进一步提高开发效率,发挥DevOps
解决思路:基于微服务中间件 ,服务网格的流量治理
- 熔断、重试
- 单元化
- 复杂环境的流量调度
CPU水位负载均衡
核心受益:
- 降低异构环境算力的差异
- 为自动扩缩容提高正向输入
解决思路:
- IaaS提供资源探针,做反馈
- 服务网格做动态负载均衡控制
后端架构实践
CPU水位负载均衡如何设计?
- 需要哪些输入
- 有哪些关键点
输入:
- 服务网格数据面,支持带权重的负载均衡策略
- 注册中心存储了所有容器的权重信息
- 宿主机能提供:容器资源使用情况,物理资源信息(如CPU型号)
关键点:
- 紧急回滚
- 大规模
- 极端场景
自适应静态权重
自适应动态权重
缺点:过度流量倾斜可能会有异常情况
更进一步解决这个缺点,提出下面的架构
更进一步,有以下演进方向:
- 微服务化
- 引入消息队列削峰,解耦
- 离在线链路切分
- 梳理强弱依赖