最完整的分布式架构设计图谱

2023-10-27

我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝、微信这样顶级流量产品、还是区块链、IOT 等热门概念、抑或如火如荼的容器生态技术如 Kubernetes,其背后的技术架构核心都离不开分布式系统。

为什么要懂分布式架构设计

系统学习分布式架构设计对于技术人的成长非常关键,对于云原生开发者而言如何设计出符合云原生设计哲学的应用,往往离不开分布式系统知识与方法论的运用。如何设计出高弹性、可配置、可分布、高性能、高容错、更安全、更韧性、快交付的云原生应用往往是衡量开发者水准的重要参考。

然而分布式系统是一个很大的概念,从架构设计、研发流程、运维部署、工程效率等多个角度均有很深的知识可以挖掘,学习成本和难度相对较大。

近期,我整理了过去阅读过的一些和分布式相关书刊和文章,加上自己做分布式开发的一些的心得分享给大家,本文作为开篇,总体上给出知识概览,后续将分篇结合代码实践来进行阐述。起草仓促,水平有限,欢迎大家一起学习指正。

分布式系统大图

一、设计

1、网关模式,Gateway

1)功能

①请求路由,客户端直接调用 Gateway,Gateway 负责路由转发到注册服务上

②服务注册,后端服务将 API 注册,Gateway 负责路由

③负载均衡,支持多种负载策略

  • round robin
  • 随机均衡算法
  • 多权重负载
  • session 粘连
  • 其它

④安全特性,支持 HTTPS,账户鉴权,及其它安全特性支持

⑤灰度发布,可以针对服务版本或者租户等特性做灰度发布

⑥API 聚合,将多个后端接口聚合,减少客户端调用次数

⑦API 编排,通过编排来串接多个 API 完成特定业务

2)设计要点

①可用性,必须保证高可用

②扩展性,可以灵活扩展以支持特定业务比如特定业务流控

③高性能,通常使用异步 IO 模型框架实现,比如 Java netty,Go Channel

④安全,如加密通信,鉴权,DDOS 防御等

⑤运维

  • 应用监控,包括容量,性能,异常检测等
  • 弹性伸缩,具备高弹性能力,以低成本应对高峰值

⑥架构

  • 与业务解耦合,提供扩展扩展机制比如 Plugin,Serverless 的思路支持后端业务
  • 服务隔离,可以按照后端服务划分网关,做到不同服务使用不同网关
  • 网关部署靠近后端,保证网络损耗最小,性能最佳

2、边车模式,Sidecar

1)价值

①分离控制与逻辑,分离业务逻辑与路由,流控,熔断,幂等,服务发现,鉴权等控制组件

②适用场景

  • 老系统改造扩展,Sidebar 进程与服务进程部署在同一个节点,通过网络协议通讯
  • 多语言混合分布式系统扩展
  • 应用程序由多方提供

2)设计要点

①标准服务协议,Sidebar 到 Service,Sidebar 到 Sidebar 协议尽可能与语言解耦

②聚合控制逻辑比如流控,熔断,幂等,重试,减少业务逻辑

③不要使用对服务侵入的方式进行进程间通讯如信号量,共享内存,优先使用本地网络通讯的方式比如 TPCP 或者 HTTP

3、服务网格,Service Mesh

新一代微服务架构,本质是服务间通信的基础设施层。

架构图(图片来源于网络,若有侵权请联系作者删除)

1)特点

①应用间通讯中间层

②轻量级网络代理

③解耦应用程序

④应用程序无感知

2)主流框架

①Istio

②Linkerd

4、分布式锁

1)解决方案

①Redis 分布式锁,SETNX key value PX expiretime

  • value 生成,最好全局唯一比如 TraceID,可以使用 /dev/urandom 生成
  • expiretime 单位是毫秒,过期锁自动释放 ,锁持有者保证过期时间内争抢资源完成计算

②悲观锁,先获取锁,再进行操作,吞吐量底

③乐观锁,使用版本号方式实现,吞吐量高,可能出现锁异常,适用于多读情况

④CAS,修改共享数据源的场景可以代替分布式锁

2)设计要点

①排他性,任意条件只有一个 client 可以获取锁

②锁有自动释放方式,比如超时释放

③锁必须高可用,且持久化

④锁必须非阻塞且可重入

⑤避免死锁,client最终一定可以获取锁,不存在异常情况锁无法释放的情况

⑥集群容错性,集群部分机器故障,锁操作仍然可用

5、配置中心

  • 静态配置,环境及软件启动配置
  • 动态配置,运行时动态调整的配置如流控开关,熔断开关等

6、异步通讯

  • 请求响应式,发送方直接向接收方发送请求
  • 发送方主动轮询
  • 发送方注册一个回调函数,接收方处理完成后回调发送方
  • 事件驱动设计(EDA)
  • 消息订阅,发送方发布消息,接收方订阅并消费消息
  • Broker 中间人,发送方向 Broker 发布消息,接收方向 Broker 订阅消息,彼此解耦,比如中间件 RocketMQ
  • 事情驱动设计优势
  • 服务间依赖解除
  • 服务隔离程度高

7、幂等性

  • 本质是一个操作,无论执行多少次,执行结果总是一致的
  • 幂等核心是全局唯一 ID,链路依据全局 ID 做幂等,依据业务复杂度可以选取多种实现方式
  • 数据库自增长 ID
  • 本地生成 uuid
  • Redis 生产 id
  • Twitter 开源算法 Snowflake
  • HTTP 幂等性,除 POST 外,HEAD,GET,OPTIONS,DELETE,PUT 均满足幂等

二、性能

1、分布式缓存

缓存更新模式

  • Cache Aside,常用模式,应用要维护缓存的失效,命中,更新等动作
  • Read/Write Through,缓存代理更新数据库操作,应用视角只有一份存储
  • Write Behind Cache,IO 加速方式之一,更新操作只在内测完成,异步进行批量更新数据库

2、异步处理

  • Push 模型,中心调度,复杂度高
  • Pull 模型,无中心调度,复杂度底
  • Push+Pull 模型

3、数据库扩展

数据库分片

  • 垂直分片
  • 字段拆分,将变化频率不同的字段拆分到不同表
  • 水平分片
  • 哈希算法来分,数据离散度高,降低热点可能性
  • 通过时间范围分片,保证数据连续性
  • 分片设计要点
  • 分片要预留足够空间,避免重新分片
  • 分片聚合要并行去做
  • 业务尽可能不去做跨分片的事务

三、容错

1、系统可用性

  • MTTF, Mean Time To Failure,系统平均运行多长时间才发生故障,越长越好
  • MTTR,Mean Time To Recover, 故障平均修复时间,越短越好
  • 可用性计算公式, Availability= MTTF /(MTTF+MTTR)

2、服务降级

  • 降低一致性
  • 强一致性,将所有的同步一致性,切换为最终一致性,提高吞吐量
  • 弱一致性,必要时候牺牲一致性换取服务整体可靠性
  • 关闭次要服务
  • 不同应用,关闭次要应用,释放物理资源
  • 相同应用,关闭应用次要功能,更多资源给到核心功能
  • 简化服务功能
  • 如简化业务流程,减少通讯数据等

3、服务限流

1)限流目的

①SLA 保证方式之一

②应对突发峰刺流量,一定程度节约容量规划成本

③租户隔离策略之一,避免某些用户占用其它用户的资源,导致服务大范围不可用

2)限流方式

①服务降级

②服务拒绝

3)解决方案

①服务权重划分,多租户环境将资源按权重划分,保证重要客户的资源

②服务延时处理,加入服务缓冲队列延缓服务压力,用于削峰

③服务弹性伸缩,依赖服务监控,弹性伸缩容

4)流控算法

①计数器

  • 单机或者集群保存某用户某时间段请求数,达到阈值则触发流控

②队列算法

  • FIFO 队列
  • 请求速度波动,消费速度均匀,队列满则流控
  • 权重队列
  • 按服务划分优先级队列,不同队列权重不同
  • 队列算法设计关键:队列长度的预设非常关键
  • 队列太长,流控未生效,服务已经被打死
  • 队列太短,流控被频繁触发,体验差

③漏斗算法

  • 本质上是队列+限流器实现,限流器保证消费速度均匀类 TCP sync backlog
  • 转发速度均匀

④令牌桶

  • 中间人已恒定速率向桶里发放令牌,服务请求拿到 token 则开始服务,否则不处理
  • 转发速度不均匀,流量小时积累,流量大时消费

⑤动态流控

  • 实时计算服务能力如 QPS,对比服务 RT 如果 RT 过大,则减少 QPS

5)设计要点

①手动开关,主动运维和应急使用

②监控通知,限流发生时干系人要清楚

③用户感知,如返回特定错误信息(错误code/错误提示)

④链路标识,RPC链路加入限流标识方便上下游业务识别限流场景做不同处理

4、熔断设计

1)场景

①过载保护,系统负载过高情况为防止故障产生,而采取的一种保护措施

②防止应用程序不断尝试可能会失败的操作

2)三个状态

①Closed,闭合状态,正常状态,系统需要一个基于时间线到错误计数器,如果错误累计达到阈值则切换至 Open 状态

②Open,断开状态,所有对服务对请求立即返回错误,不用调用后端服务进行计算

③Half-Open,半开状态,允许部分请求流量进入并处理,如果请求成功则按照某种策略切换到 Closed 状态

3)设计要点

①定义触发熔断的错误类型

②所有触发熔断的错误请求必须要有统一的日志输出

③熔断机制必须有服务诊断及自动恢复能力

④最好为熔断机制设置手动开关用于三种状态的切换

⑤熔断要切分业务,做到业务隔离熔断

5、补偿事务

①CAP

  • 一致性 (Consistence)、可用性 (Availability)、分区容忍性 (Partition Tolerance)

②BASE

  • Basic Availabillity,基本可用
  • Soft State,软状态
  • Eventual Consistency,最终一致性

③Design For Failure

④Exponential Blackoff,指数级退避

四、DevOps

1、部署

1)基础设施

①云

  • 公有云
  • 私有云
  • 混合云

②容器技术

  • Docker
  • Kubernetes

2)部署策略

①停机部署

②滚动部署

③蓝绿部署

④灰度部署

⑤A/B 测试

2、配置管理

  • Ansible
  • Puppet
  • Shippable

3、监控

  • Nagios
  • DynaTrace

4、CI 与 CD

五、工程效率

1、敏捷管理

  • Scrum

2、持续集成

  • Jenkins
  • CodeShip

3、持续交付

总结及学习建议

分布式系统在阿里巴巴经济体有着广泛的应用,以笔者所在的弹性计算技术团队为例,当业务足够规模化后,最终面临的技术问题都是通过践行分布式系统架构的设计理念和方法论得以解决,可以说分布式系统架构的知识与方法论是当前互联网应用规模化后的通用解决方案。

学习分布式系统设计也不是一蹴而就,需要不断汲取理论知识,然后将理论不断付诸实践,最终通过一次次的调优来将知识的价值最大化。

笔者最后的建议是先理论、后实践、重实践、不妥协,所谓纸上得来终觉浅,绝知此事要躬行,与君共勉。

作者丨杨泽强(竹涧)

来源丨公众号:阿里巴巴云原生(ID:Alicloudnative)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最完整的分布式架构设计图谱 的相关文章

随机推荐

  • MDK 编译错误:multiply defined (重复定义)

    这个代码实现很简单 出现重复定义首先检查了自己的头文件 发现没问题 后来经过师兄的点拨 发现他提示后面有 表示有两个头文件key1 c和key c 马上检查了工程 果然发现有两个 c文件 删除一个即可解决问题
  • 广度优先探索例题java_LeetCode:广度优先搜索(BFS)算法(常见面试题)

    今天推荐一道常见的面试算法题 比较实用也比较常见 一 认识广度优先搜索算法 广度优先搜索 BFS 算法是图的一种遍历方法 它的核心思想是从图的某一个节点开始 依次遍历相邻节点 再从这些相邻节点继续向外层节点遍历 直到连通图的所有节点均被访问
  • Django-项目构建(一)

    环境 python3 Django2 window10 工具 pycharm 构建项目前期准备工作 安装python3 Django2 等 略 一 使用git Bash Here 打开git bash Here 构建项目命令 django
  • java取html中的table_从一段html的table标签中按列提取信息

    我们平时经常会遇到提取某个html中某个table的信息 比如 我们要提取出序号 登记编号 出质人等等 我的思路是先通过正则锁定该table 在通过Jsoup来按列解析内容 我将提取信息的过程抽取出了一个方法 其中内含Jsoup和Regex
  • idea配置使用git以及ssh key的介绍使用

    文章目录 1 Git GUI 的使用 2 ssh key 的介绍和使用 安装ssh key 3 idea中配置并使用git idea配置git 1 Git GUI 的使用 首先先将 git gui 汉化一下 把msgs文件夹copy到 Gi
  • 本地把虚拟光驱传到服务器,将文件传到服务器

    将文件传到服务器 内容精选 换一换 监控数据上报功能可以将系统中采集到的监控数据写入到文本文件 并以FTP或SFTP的形式上传到指定的服务器中 使用该功能前 管理员需要在FusionInsight Manager页面进行相关配置 监控数据上
  • windows服务程序中创建用户进程

    最近碰到个问题 需要在服务中检测用户桌面的情况 但是服务程序都是SYSTEM账户下运行 属于Session0 不能检测到用户桌面的情况 所以就需要另启一个用户进程来获取这些信息 然后发送给服务 所以就用到了 CreateProcessAsU
  • 卷积神经网络系列之卷积/池化后特征图大小怎么计算??

    1 卷积后的大小 W 矩阵宽 H 矩阵高 F 卷积核宽和高 P padding 需要填充的0的个数 N 卷积核的个数 S 步长 width 卷积后输出矩阵的宽 height 卷积后输出矩阵的高 width W F 2P S 1 向下取整 h
  • 小米路由器mini 安装openWrt+更新源+挂载U盘+安装python

    刚刚入手一个小米路由器mini 本来就是打算装openWrt的 想试试玩玩看 刷openwrt的基本流程是参考的如下博主的文章 http www right com cn forum thread 147929 1 1 html 没有遇到什
  • BUUCTF [极客大挑战 2019]FinalSQL

    极客大挑战 2019 FinalSQL 操作 脚本 总结 操作 打开题目 又是这个鬼 跟着他的流程走 点按钮 让我们试试别的 告诉我们对了 但是不是这张表 埋坑 怀疑这个地址是存在sql注入的 经过fuzz 发现过滤了空格 union之类的
  • DOM方式实现Excel导入

    DOM解析Excel 在我们的工作场景中经常会遇到数据录入的需求 有些批量数据录入太麻烦 就需要用到批量导入的方式来提高效率 这就涉及到读取Excel数据的技术 Appache Poi提供了DOM解析和SAX解析两种方式 本篇主要记录自己工
  • Windows Terminal 安装gsudo插件

    Gsudo Windows下类似于linux的sudo 可用于提权 新建 Windows Terminal 标签页时可以用于新建有管理员的页面 或者直接sudo将当前页面提权 需要在安装过程中把sudo命令和gsudo命令建立关联 Powe
  • elasticsearch python连接池吗_了解Elasticsearch及其与Python的对接实现

    什么是 Elasticsearch 但我们想查数据的时候就免不了搜索 搜索就离不开搜索引擎 百度 谷歌都是一个非常庞大复杂的搜索引擎 他们几乎索引了互联网上开放的所有网页和数据 然而对于我们自己的业务数据来说 肯定就没必要用这么复杂的技术了
  • 使用的工具

    文档 devdocs 开发知识 css tricks css技巧分享 开发工具 可以检测前端代码规范的工具 sonarlint 还未用过 样式工具 collect ui 用来查看设计的ui界面参考 其他工具 虚拟号码生成 https sms
  • CentOS8配置yum/dnf镜像源

    Centos8 dnf命令 DNF意思是 Dandified Yum 这是下一代的yum软件包管理器 Yum的派生 Centos8开始使用dnf工具来管理软件包 它可以在基于RPM的Linux发行版上安装 更新和删除软件包 它会自动计算依赖
  • MATLAB克劳特算法,克劳特(Crout)(LU)分解法求解线性方程组的matlab实现

    克劳特 Crout LU 分解法求解线性方程组的matlab实现 由会员分享 可在线阅读 更多相关 克劳特 Crout LU 分解法求解线性方程组的matlab实现 3页珍藏版 请在人人文库网上搜索 1 1 克劳特 Crout LU 分解法
  • c语言课程主要目的和内容,C语言程序设计课程教学大纲

    C语言程序设计课程教学大纲 C语言程序设计课程教学大纲 一 本课程的性质 目的和任务 1 课程的性质 本课程是计算机科学与技术专业的一门重要的专业基础课程 它既可以为其它专业课程奠定程序设计的基础 又可以作为其它专业课程的程序设计工具 2
  • OpenWRT 增加内核模块及应用方法

    进入package目录 创建模块目录 cd mcp branches V1 1 beta1 mcp package mkdir example 进入example目录 创建Makefile文件和代码路径 cd example touch M
  • VMware虚拟机Linux系统根目录空间扩充操作

    VMWare虚拟机安装的应用多了 导致根目录空间不足 有没有办法可以将根目录空间进行扩充呢 经过搜集各各资料 顺利解决问题 把服务器的空间由6G扩成8G 现将执行全过程总结如下 以 供分享 首先 介绍下大体的解决思路 要想扩充 必须要有一块
  • 最完整的分布式架构设计图谱

    我们身处于一个充斥着分布式系统解决方案的计算机时代 无论是支付宝 微信这样顶级流量产品 还是区块链 IOT 等热门概念 抑或如火如荼的容器生态技术如 Kubernetes 其背后的技术架构核心都离不开分布式系统 为什么要懂分布式架构设计 系