架构浅谈 | 青训营笔记

143 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。

学员手册: 【网络与部署学习资料(下)】第三届字节跳动青训营 - 后端专场 - 掘金 (juejin.cn)

本课程的包含以下四个方面:

  • 什么是架构

    • 围绕架构的定义和演进两部分内容展开
  • 企业级后端架构剖析

    • 详细介绍企业级后端架构的形态
  • 企业级后端架构的挑战

    • 企业级架构都面临着哪些挑战,如何解决
  • 后端架构实战

    • 结合前三部分的知识点,以第三部分中的一个挑战为例,讲解如何做架构设计

什么是架构

常见软件架构:

  • 单机
    • 优点:简单
    • 缺点:c10K 问题(服务器如何承载10k个并发连接,承载能力有限);运维需要停服
    • 演进: 如何卖更多蛋糕?更多的工人
  • 单体
    • 分布式部署,复制进程到多个机器上,并行工作
  • 垂直应用
    • 按应用垂直切分的单体(拆成几个功能互不相干的软件,之间没有沟通)
    • 优点:水平扩容;运维不需要停服
    • 缺点:职责多导致开发效率不高;爆炸半径仍旧较大
    • 演进:如何提高做蛋糕的效率?分工协作
  • SOA (Service Oriented Architecture,面向服务架构)
    • 定义:1.将应用不同功能单元抽象为服务;2.定义不同服务之间的通信标准
    • 缺点:ESB (企业服务总线) 往往需要一整套解决方案
  • 微服务 (Microservice)
    • SOA的去中心化演进方向。在 SOA 架构中,ESB 起到了至关重要的作用。但从架构拓扑来看,它更像是一个集中式的模块。有一个 SOA 分布式演进的分支,最终的形态便是微服务。
    • 问题:数据一致性;高可用;治理、容灾;解耦过细导致运维成本上升

如何给架构下定义

  • 有关软件整体结构和组件的抽象描述
  • 用于指导软件系统各个方面的设计 通俗讲,架构在软件实现的方法选择上提供指导作用

架构的重要性

  • 地基牢固
  • 盖得更高
  • 看的更远

企业级后端架构剖析

云计算

基础:

  • 虚拟化技术
  • 编排方案

架构:

  • IaaS
  • PaaS
  • SaaS
  • FaaS

云原生

在公有云、自由云、混合云等新型动态环境中,构建和运行可弹性拓展的应用

image.png

弹性计算资源

  • 服务资源调度
    • 微服务(资源需求少)
    • 大服务(资源需求大)
  • 计算资源调度
    • 在线(需要快速的资源响应)
    • 离线(动态更新,资源响应可以放缓)
  • 消息队列
    • 在线:削峰、解耦
    • 离线:大数据分析

弹性存储资源

  • 经典
    • 对象存储,例如宣传视频
    • 大数据,例如用户消费记录
  • 关系型数据库
    • 收银记录,选课记录等等
  • 元数据
    • 数据量不大但是比较关键描述性数据,比如服务发现:蛋糕店通讯录
  • NoSQL
    • KV数据库
    • 文档数据库 总结:将存储资源当成服务一样

DevOps

软件交付的工具,贯穿软件开发周期

自动化流程,提高开发、交付的效率

image.png

微服务架构

通信(其实不太准确把这两个并列来比,RPC可能和Restful来比较更合适):

  • HTTP
  • RPC

如何选择?

  • 性能(RPC性能好,HTTP可解释性好)
  • 服务治理
  • 协议可解释性

一般负载均衡到API服务使用HTTP,从API服务往后开始使用RPC

服务网格

  • 微服务之间通讯的中间层
  • 高性能网络代理
  • 业务代码与治理解耦

和RPC/HTTP框架比较:

  • 异构系统治理统一化
  • 与业务进程解耦,生命周期易管理 下图中的service mesh 就是服务网格

image.png

企业级后端架构挑战

挑战:

  • 基础设施层面
    • 物理资源有限
    • 资源利用率受限于部署服务(看起来都被部署占用了,但部分资源没有使用)
  • 用户层面
    • 网络通信开销大
    • 网络抖动增加运维成本
    • 异构环境下不同实例资源水位不均(不同物理机器的CPU能力可能不一样)

离在线资源并池

核心受益:

  • 降低物理资源成本
  • 提供更多弹性资源

在线资源池:高可用、高并发服务

离线资源池:数据分析

在线业务特点:

  • IO密集型为主
  • 潮汐性、实时性 离线业务特点:
  • 计算密集型占多数
  • 非实时性

策略:将两个资源池合并,根据一天中不同时间段的业务流量特点,两个资源池的占比动态分配。例如白天多在线,凌晨多离线。

问题:同一个机器怎么做离在线隔离? 用虚拟化技术、cgroup,对CPU做隔离,互不影响

自动扩缩容

核心受益:降低业务成本

利用在线业务潮汐性自动扩缩容

问题:扩缩容指标?一般使用CPU和内存利用率,基于IO和业务QPS等比较困难,或者可行性不好。

微服务亲和性部署

核心受益:

  • 降低业务成本
  • 提高服务可用性 什么是亲和性呢?例如两个容器之间通信频繁,那么可以考虑编排到一台机器上。

image.png

流量治理

核心受益:

  • 提高微服务调用容错
  • 容灾
  • 进一步提高开发效率,发挥DevOps

解决思路:基于微服务中间件 ,服务网格的流量治理

  • 熔断、重试
  • 单元化
  • 复杂环境的流量调度

CPU水位负载均衡

核心受益:

  • 降低异构环境算力的差异
  • 为自动扩缩容提高正向输入

解决思路:

  • IaaS提供资源探针,做反馈
  • 服务网格做动态负载均衡控制

后端架构实践

CPU水位负载均衡如何设计?

  • 需要哪些输入
  • 有哪些关键点

image.png

输入:

  • 服务网格数据面,支持带权重的负载均衡策略
  • 注册中心存储了所有容器的权重信息
  • 宿主机能提供:容器资源使用情况,物理资源信息(如CPU型号)

关键点:

  • 紧急回滚
  • 大规模
  • 极端场景

自适应静态权重

image.png

自适应动态权重

image.png

缺点:过度流量倾斜可能会有异常情况

更进一步解决这个缺点,提出下面的架构

image.png

更进一步,有以下演进方向:

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

image.png