云原生时代|分布式系统设计知识图谱(内含22个知识点)

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

为什么要懂分布式架构

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

然后而分布式系统是一个很大的概念,从架构设计、研发流程、运维部署、工程效率等多个角度均有很深的知识可以挖掘,学习成本和难道相对较大。近期整理了过去阅读过的一些和分布式相关书刊和文章,加上自己做分布式开发的一些的心得分享给大家,本文作为开篇,总体上给出知识概览,后续将分篇结合代码实践来进行阐述。起草仓促,水平有限,欢迎大家一起学习指正。

分布式系统大图

一、设计

网关模式,Gateway

功能

  • 请求路由,客户端直接调用 Gateway,Gateway 负责路由转发到注册服务上
  • 服务注册,后端服务将 API 注册,Gateway 负责路由
  • 负载均衡,支持多种负载策略

    • round robin
    • 随机均衡算法
    • 多权重负载
    • session 粘连
    • 其它
  • 安全特性,支持 HTTPS,账户鉴权,及其它安全特性支持
  • 灰度发布,可以针对服务版本或者租户等特性做灰度发布
  • API 聚合,将多个后端接口聚合,减少客户端调用次数
  • API 编排,通过编排来串接多个 API 完成特定业务

设计要点

  • 可用性,必须保证高可用
  • 扩展性,可以灵活扩展以支持特定业务比如特定业务流控
  • 高性能,通常使用异步 IO 模型框架实现,比如 Java netty,Go Channel
  • 安全,如加密通信,鉴权,DDOS 防御等
  • 运维

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

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

边车模式,Sidecar

价值

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

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

设计要点

  • 标准服务协议,Sidebar 到 Service,Sidebar 到 Sidebar 协议尽可能与语言解耦
  • 聚合控制逻辑比如流控,熔断,幂等,重试,减少业务逻辑
  • 不要使用对服务侵入的方式进行进程间通讯如信号量,共享内存,优先使用本地网络通讯的方式比如 TPCP 或者 HTTP

服务网格,Service Mesh

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

架构图

特点

  • 应用间通讯中间层
  • 轻量级网络代理
  • 解耦应用程序
  • 应用程序无感知

主流框架

  • Istio
  • Linkerd

分布式锁

解决方案

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

    • value 生成,最好全局唯一比如TraceID,可以使用/dev/urandom生成
    • expiretime单位是毫秒,过期锁自动释放 ,锁持有者保证过期时间内争抢资源完成计算
  • 悲观锁,先获取锁,再进行操作,吞吐量底
  • 乐观锁,使用版本号方式实现,吞吐量高,可能出现锁异常,适用于多读情况
  • CAS,修改共享数据源的场景可以代替分布式锁

设计要点

  • 排他性,任意条件只有一个client可以获取锁
  • 锁有自动释放方式,比如超时释放
  • 锁必须高可用,且持久化
  • 锁必须非阻塞且可重入
  • 避免死锁,client最终一定可以获取锁,不存在异常情况锁无法释放的情况
  • 集群容错性,集群部分机器故障,锁操作仍然可用

配置中心

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

异步通讯

  • 请求响应式,发送方直接向接收方发送请求

    • 发送方主动轮询
    • 发送方注册一个回调函数,接收方处理完成后回调发送方
  • 事件驱动设计(EDA)

    • 消息订阅,发送方发布消息,接收方订阅并消费消息
    • Broker 中间人,发送方向Broker发布消息,接收方向Broker订阅消息,彼此解耦,比如中间件RocketMQ
    • 事情驱动设计优势

      • 服务间依赖解除
      • 服务隔离程度高

幂等性

  • 本质是一个操作,无论执行多少次,执行结果总是一致的
  • 幂等核心是全局唯一ID,链路依据全局ID做幂等,依据业务复杂度可以选取多种实现方式

    • 数据库自增长ID
    • 本地生成uuid
    • Redis生产id
    • Twitter开源算法 Snowflake
  • HTTP幂等性,除POST外,HEAD,GET,OPTIONS,DELETE,PUT均满足幂等

二、性能

分布式缓存

  • 缓存更新模式

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

异步处理

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

数据库扩展

  • 数据库分片

    • 垂直分片

      • 字段拆分,将变化频率不同的字段拆分到不同表
    • 水平分片

      • 哈希算法来分,数据离散度高,降低热点可能性
      • 通过时间范围分片,保证数据连续性
      • 按照业务种类划分,比如数据分类,租户分离等
    • 分片设计要点

      • 分片要预留足够空间,避免重新分片
      • 分片聚合要并行去做
      • 业务尽可能不去做跨分片的事务

三、容错

 

系统可用性

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

服务降级

  • 降低一致性

    • 强一致性,将所有的同步一致性,切换为最终一致性,提高吞吐量
    • 弱一致性,必要时候牺牲一致性换取服务整体可靠性
  • 关闭次要服务

    • 不同应用,关闭次要应用,释放物理资源
    • 相同应用,关闭应用次要功能,更多资源给到核心功能
  • 简化服务功能

    • 如简化业务流程,减少通讯数据等

服务限流

  • 限流目的

    • SLA保证方式之一
    • 应对突发峰刺流量,一定程度节约容量规划成本
    • 租户隔离策略之一,避免某些用户占用其它用户的资源,导致服务大范围不可用
  • 限流方式

    • 服务降级
    • 服务拒绝
  • 解决方案

    • 服务权重划分,多租户环境将资源按权重划分,保证重要客户的资源
    • 服务延时处理,加入服务缓冲队列延缓服务压力,用于削峰
    • 服务弹性伸缩,依赖服务监控,弹性伸缩容
  • 流控算法

    • 计数器

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

      • FIFO队列

        • 请求速度波动,消费速度均匀,队列满则流控
      • 权重队列

        • 按服务划分优先级队列,不同队列权重不同
      • 队列算法设计关键:队列长度的预设非常关键

        • 队列太长,流控未生效,服务已经被打死
        • 队列太短,流控被频繁触发,体验差
    • 漏斗算法

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

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

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

    • 手动开关,主动运维和应急使用
    • 监控通知,限流发生时干系人要清楚
    • 用户感知,如返回特定错误信息(错误code/错误提示)
    • 链路标识,RPC链路加入限流标识方便上下游业务识别限流场景做不同处理

熔断设计

  • 场景

    • 过载保护,系统负载过高情况为防止故障产生,而采取的一种保护措施
    • 防止应用程序不断尝试可能会失败的操作
  • 三个状态

    • Closed,闭合状态,正常状态,系统需要一个基于时间线到错误计数器,如果错误累计达到阈值则切换至Open状态
    • Open,断开状态,所有对服务对请求立即返回错误,不用调用后端服务进行计算
    • Half-Open,半开状态,允许部分请求流量进入并处理,如果请求成功则按照某种策略切换到Closed状态
  • 设计要点

    • 定义触发熔断的错误类型
    • 所有触发熔断的错误请求必须要有统一的日志输出
    • 熔断机制必须有服务诊断及自动恢复能力
    • 最好为熔断机制设置手动开关用于三种状态的切换
    • 熔断要切分业务,做到业务隔离熔断

补偿事务

  • CAP

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

    • Basic Availabillity,基本可用
    • Soft State,软状态
    • Eventual Consistency,最终一致性
  • Design For Failure
  • Exponential Blackoff,指数级退避

四、DevOps

 

部署

  • 基础设施

      • 公有云
      • 私有云
      • 混合云
    • 容器技术

      • Docker
      • Kubernetes
  • 部署策略

    • 停机部署
    • 滚动部署
    • 蓝绿部署
    • 灰度部署
    • A/B 测试

配置管理

  • Ansible
  • Puppet
  • Shippable

监控

  • Nagios
  • DynaTrace

CI与CD

 

五、工程效率

 

敏捷管理

  • Scrum

持续集成

  • Jenkins
  • CodeShip

持续交付

写在最后

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

学习分布式系统设计也不是一蹴而就,需要不断汲取理论知识,然后将理论不断付诸实践,最终通过一次次的调优来将知识的价值最大化。笔者最后的建议是先理论、后实践、重实践、不妥协,所谓纸上得来终觉浅,绝知此事要躬行,与君共勉。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysq启动失败

文章目录一、一站式解决1. 问题分析定位二、特殊场景2.1. 问题分析定位2.2. 解决方案2.3. 解决方案2一、一站式解决 1. 问题分析定位 # 找到MySQL的配置文件,复制mysql的数据目录 vim /etc/my.cnf# 进入msyql的数据目录 cd /data/mysql# 查看日志文件 vim mysql.e…

藏不住了,这就是阿里 AI 的真正实力!

不好意思,我要放大招了! 在今天的杭州云栖大会上,阿里巴巴首次公布人工智能调用规模: 每天调用超 1万亿 次 服务全球 10亿 人 日处理图像 10亿 张 视频 120万 小时 语音 55万 小时 自然语言 5千亿 句 在AI芯片、AI云服务、AI算…

Error和Exception(异常)

Error和Exception(异常) 掌握以下三种类型的异常:检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如打开一个不存在文件时,一个异常就发生了,这些异常在…

Kubernetes 是如何调度的?

作者 | 阿文,责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN(ID:CSDNnews)自互联网出现以来 ,云计算的概念已经提出了有 50 年。从1957 年,John McCarthy 将计算机中的分时共享概念设计成了一种工具。从此…

# Schedulerx正式登陆Ali-k8s应用目录

简介 分布式任务调度 SchedulerX 是阿里巴巴基于 Akka 架构自研的的分布式任务调度平台,今天正式登陆阿里云容器服务Kubernetes应用目录,支持用户以云原生的方式获取定时、工作流任务编排、分布式批量调度等功能,同时具有高可靠、海量任务、…

刚刚,阿里巴巴小程序生态联盟重磅启动

9月27日下午,阿里巴巴小程序繁星计划峰会作为杭州云栖大会的压轴好戏,在云栖小镇国际会展中心迎来千余位商家、合作伙伴、个人开发者和行业专家。峰会以“小程序、大生态”为题,发布了阿里巴巴小程序繁星计划补贴的更多细节方案,并…

因为一个跨域请求,我差点丢了饭碗

来源 | 编程技术宇宙责编 | 王晓曼封图 | CSDN下载自视觉中国浏览器基本原理我叫小风,是Windows帝国一个普通的上班族。今天,我入职了一家浏览器公司,公司的主营业务是为人类提供Internet上网服务,我的岗位是负责执行JavaScript代…

MongoDB BI Connector 实战指南

MongoDB 使用 BI Connector 来支持 BI 组件直接使用 SQL 或 ODBC 数据源方式直接访问 MongoDB,在早期 MongoDB 直接使用 Postgresql FDW 来实现 SQL 到 MQL 的转换,后来实现更加轻量级的 mongosqld 来支持 BI 工具的连接。 安装 BI Connector 参考 Inst…

基于Topic消息路由的M2M设备间通信Node JS SDK 示例

概述 M2M(即Machine-to-Machine)是一种端对端通信技术。本章节以Node JS SDK为例,使用基于Topic消息路由的M2M设备间通信,主要介绍如何基于物联网平台构建一个M2M设备间通信架构。 实验步骤 第一部分:配置相关 1、产品…

8 种架构设计模式优缺点大曝光 | 原力计划

作者 | 程序员Tony责编 | 王晓曼出品 | CSDN博客什么是架构我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果,哈哈,我理解,架构就是骨架。人类的身体的支撑是主要由骨架来承担的,然…

企业实战_06_MyCat 常用的分片算法

接上一篇:企业实战_05_MyCat用户密码加密 https://gblfy.blog.csdn.net/article/details/100056536 下一篇:企业实战_07_MyCat 搭建Mysql 一主一从复制环境 https://gblfy.blog.csdn.net/article/details/118640210

数据库OceanBase创始人阳振坤:通关TPC-C到底有多难?

自从蚂蚁金服自研数据库OceanBase获得TPC-C测试第一名后,引起了行业内外大量关注,我们衷心的感谢大家对OceanBase的支持与厚爱,也虚心听取外界的意见和建议。为了让大家更好的了解测试的技术细节,我们特意邀请了OceanBase的核心研…

为啥程序员下班后只关显示器从不关电脑?

你下班时是不是只将显示器一关,揣上手机就走了?曾有安保人员晚上来办公室巡查时问,为什么这些人不关机就下班呢?因为等一切工具准备就绪后,半个小时已经过去了。你知道程序员的时薪有多贵吗?效率多高吗&…

从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑?

阿里妹导读:从十余年前的各种分布式系统研发到现在的容器云,从支撑原有业务到孵化各个新业务,企业的发展离不开统一的、与时俱进的技术架构。本篇文章从企业分布式应用架构层面介绍了云原生计算架构带来的变化,希望能够帮助更多企…

那些年,我们见过的 Java 服务端“问题”

导读 明代著名的心学集大成者王阳明先生在《传习录》中有云: 道无精粗,人之所见有精粗。如这一间房,人初进来,只见一个大规模如此。处久,便柱壁之类,一一看得明白。再久,如柱上有些文藻&#x…

中兴通讯uSmart云电脑,开启安全办公新时代

2020年春天,以5G、人工智能、云计算为代表的“新基建”蔚然成风,着眼国家数字经济体系建设,打造数字经济体系底座的“新基建”,无疑成为中国经济整体应对未来发展的核心方案。可以说,没有任何一个时期比现在更能够彰显…

阿里张磊:云计算生态价值点正迅速聚焦到“应用”上

导读:云原生不再只是基础设施的开发和运维人员的关注点,在应用交付领域小组成立之后,CNCF 基金会正在同应用开发和应用运维人员更紧密的联系在一起。 云原生的理念如今正如火如荼。它不仅仅是一种技术,更是社区基于对云的思考&…

SpringBoot 整合 Spring Cloud Alibaba Nacos 连通性+负载均衡

文章目录一、整合版本说明1. 毕业版本依赖关系(推荐使用)2. 组件版本关系3. 演示版本二、整合实战2.1. 聚合模块设计2.2. 创建聚合parent2.3. 依次创建子项目三、子模块配置3.1. 订单模块3.2. 产品模块3.3. 用户模块3.4. 扣库存模块3.5. 购物车模块四、测试案例4.1. 订单模块4.…

使用dubbo后尽量不用要@Service可能引起冲突

如下有几个包都含有Service dubbo最新版本2.7.8,已经把Service换成DubboService 示例实现类 package com.dubboprovider.service;import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Component;//zookeeper 服务注…

面试中遇到这 3 个SQL问题,最容易掉坑里!

作者 | Nathan R译者 | 天道酬勤,责编 | Carol封图 | CSDN下载自视觉中国在本文中,作者将介绍来自3个在技术面试中的真实的SQL问题,这些问题都是在实际公司进行技术筛选时提出的。最常见的读者问题:我应该如何准备SQL面试&#xf…