当前位置: 首页 > news >正文

读构建可扩展分布式系统:方法与实践15可扩展系统的基本要素

1. 可扩展系统的基本要素

1.1. 分布式系统在本质上就是复杂的,你必须考虑多种故障模式,并设计应对所有可能发生的情况的处理方式

1.2. 大规模应用程序需要协调大量的硬件和软件组件,共同实现低延迟和高吞吐量的能力

1.3. 面临的挑战是将所有活动部件组合成一个应用程序来运行,使其既能满足需求又不会耗费过多成本

  • 1.3.1. 新的编程抽象、平台模型和硬件让你更容易构建具有更高的性能、更好的可扩展性和更大的弹性的更复杂的系统

2. 自动化

2.1. 在构建大型系统时,工程师是相当昂贵但必不可少的资源

2.2. 需要部署频繁的更改来改善客户体验,并确保可靠和可扩展的操作

2.3. 在不停机的情况下每天有效地将数百个更改推送到已部署系统的能力是系统规模化的关键所在

2.4. 促进自动化的一组工具和实践体现在DevOps文化中

  • 2.4.1. DevOps包含一组面向从开发到部署各个级别过程的自动化实践和工具

  • 2.4.2. DevOps的核心是持续交付(CD)实践,由用于代码配置管理、自动化测试、部署和监控的复杂工具链提供支持

2.5. DevOps实践对于成功的可扩展系统至关重要

  • 2.5.1. 团队有责任设计、开发和运营他们的微服务,微服务通过良好定义的接口与系统的其余部分进行交互

  • 2.5.2. 借助自动化工具链,可以在微服务中独立部署本地更改和新功能,同时不干扰系统操作

  • 2.5.3. 自动化减少了协调开销,提高了生产力,缩短了发布周期

  • 2.5.4. 意味着你的工程投资将获得更大的回报

3. 可观测性

3.1. 你无法管理你无法衡量的东西

3.2. 由于有大量移动部件,所有部件都在可变负载条件下运行,容易出现不可预测的错误

3.3. 需要借助测量系统提供的健康状况和行为来观测系统状态

  • 3.3.1. 提供基础设施不断生成的细粒度指标和日志数据来捕获系统当前状态

  • 3.3.2. 分析聚合实时指标并采取行动,对指示实际或未决故障的警报做出反应

3.4. 可观测性的第一个基本要素是具有一个仪表化系统,它不断以指标和日志条目的形式发出系统遥测数据

  • 3.4.1. 可以来自操作系统、你在应用程序中使用的基础平台(例如,消息传递、数据库)以及你部署的应用程序代码

  • 3.4.2. 指标表示资源利用率以及系统各部分提供的延迟、响应时间和吞吐量

3.5. 代码检测是强制性的,你可以使用开源框架或专有解决方案

  • 3.5.1. 指标和日志条目形成了基于时间序列的连续的数据流,表征了你的应用程序随时间的行为

3.6. 捕获原始指标数据是可观测性系统推断并感知态势的先决条件

  • 3.6.1. 需要快速处理数据流,它才可能让系统及时采取行动

  • 3.6.2. 包括持续监控当前状态、探索历史数据以了解或诊断一些意外的系统行为,以及在超过阈值或发生故障时发送实时警报

3.7. Prometheus、Grafana和Graphite是目前广泛使用的技术,它们提供了适用于可观测性栈各个部分的开箱即用的解决方案

3.8. 可观测性是可扩展分布式系统的必要组成部分

4. 部署平台

4.1. 可扩展系统需要大规模、有弹性且可靠的计算和数据平台

4.2. 可以使用专为操作设计的脚本语言自动调用配置

  • 4.2.1. 基础架构即代码(IaC),也是DevOps的基本要素

4.3. 传统上,虚拟机是应用程序的部署单元

  • 4.3.1. 容器镜像支持将应用程序代码和依赖项打包到单个可部署单元中

  • 4.3.2. 与虚拟机相比,容器消耗的资源更少,因此可以在单个虚拟机上打包多个容器,更有效地利用硬件资源

4.4. 容器通常与集群管理平台(如Kubernetes或Apache Mesos)一起使用

  • 4.4.1. 容器编排平台为你提供API来控制容器的执行方式、时间和位置

  • 4.4.2. 平台允许你自动部署容器并支持使用自动缩放的不同系统负载,简化集群中在多个节点部署多个容器的管理工作

5. 数据湖

5.1. 随着时间的推移,你的系统将生成许多PB级或更多的数据

  • 5.1.1. 数据中的大部分很少被你的用户访问

5.2. 管理、组织和存储历史数据存储库是数据仓库、大数据和数据湖的领域范围所在

  • 5.2.1. 本质是以一种可以检索、查询和分析的形式来存储历史数据

5.3. 数据湖的特征是以异构格式存储和编目数据,从原生blob到JSON再到关系数据库提取数据

  • 5.3.1. 利用Apache Hadoop、Amazon S3或Microsoft Azure Data Lake等低成本对象存储

  • 5.3.2. 灵活的查询引擎支持数据的分析和转换

  • 5.3.3. 可以使用不同的存储类别,以本质上更长的检索时间换取更低的成本,继而优化成本

6. 并发系统

6.1. 分布式系统包括多个独立的代码片段,它们在不同位置的多个处理节点上并行或并发地执行

6.2. 任何分布式系统都是并发系统,即使每个节点一次只处理一个事件也是如此

  • 6.2.1. 在分布式系统中协调节点充满了风险

6.3. 编写软件来并发地执行多个操作,有助于优化单个节点上的处理能力和资源利用率,提高本地和系统范围的处理能力

6.4. 在过去的计算时代,每个CPU在任何时刻都只能执行一条机器指令

  • 6.4.1. 程序试图读取文件或在网络上发送消息时,它必须与CPU外围的硬件子系统(磁盘、网卡)进行交互

  • 6.4.2. 从硬盘读取数据大约需要10ms。在此期间,程序必须等待可供处理的数据

  • 6.4.3. Linux等操作系统可以在单个CPU上运行多个程序的方式

  • 6.4.4. 将软件明确地构造成具有多个可以并行执行的活动,在其他任务等待I/O时,操作系统可以安排有工作要做的任务

6.5. 使用多核芯片,可以在每个内核上并发执行具有多个并行活动的软件系统,最多可达到可用内核的数量

  • 6.5.1. 每种编程语言都有自己的线程机制

  • 6.5.2. 所有并发机制的底层语义都是相似的

  • 6.5.3. 主流使用的主要线程模型只有几个

6.6. 在过去50年里,并发模型一直是计算机科学中研究和探索较多的主题

  • 6.6.1. CSP(通信顺序进程)模型构成了Go并发特性的基础

    • 6.6.1.1. 在Go中,并发的单位是goroutine,goroutine使用无缓冲或缓冲通道发送消息来进行通信
  • 6.6.2. Erlang实现了并发的actor模型

    • 6.6.2.1. actor是没有共享状态的轻量级进程,通过向其他actor发送异步消息来进行通信

    • 6.6.2.2. actor使用邮箱或队列来缓冲消息,可以使用模式匹配来选择要处理的消息

  • 6.6.3. Node.js避开多线程,利用由事件循环管理的单线程非阻塞模型

    • 6.6.3.1. 该模型适用于频繁执行I/O请求的代码

    • 6.6.3.2. 如果你的代码需要执行CPU密集型操作,例如对大型列表进行排序,那么你只有一个线程

      6.6.3.2.1. 这将阻止其他请求,直到排序完成

      6.6.3.2.2. 这并非一种理想的情况

6.7. 在可扩展分布式系统的世界中,并发是无处不在的

6.8. 无论你使用的是C/C++中的pthreads库,还是受CSP启发的经典Go并发模型,需要避免的问题都是相同的

7. 线程

7.1. 默认情况下,每个软件进程都有一个执行线程,即操作系统在安排进程执行时所管理的线程

7.2. 线程本质上是我们构建可扩展分布式系统时用于数据处理和数据库平台的组件

7.3. 在许多情况下,你可能不会显式编写多线程代码

7.4. 许多平台还通过配置参数来调整其并发能力,这意味着要调整系统性能,你需要了解更改各种线程和线程池设置的影响

7.5. 线程执行顺序

  • 7.5.1. 从程序开发者的角度来看,执行顺序是不确定的(nondeterministic)

  • 7.5.2. 不确定性(nondeterminism)这个概念是理解多线程代码的基础

  • 7.5.3. 一旦调度程序允许一个线程在CPU上执行一段时间,它就可以在指定的时间段后中断该线程,并安排另一个线程运行

    • 7.5.3.1. 中断称为抢占
  • 7.5.4. 调度程序根据调度算法决定何时运行哪个线程,线程是独立且异步地运行,直到完成

  • 7.5.5. 无论线程执行的顺序如何(你无法控制)​,你的代码都应该产生正确的结果

7.6. 线程的状态

  • 7.6.1. 多线程系统有一个系统调度程序来决定何时运行哪些线程

    • 7.6.1.1. 执行最高优先级的线程

7.7. 线程池

  • 7.7.1. 许多多线程系统需要创建和管理一组执行相似任务的线程

  • 7.7.2. 线程集合为线程池

    • 7.7.2.1. 线程池包含多个工作线程,它们通常执行相似的任务,并以一个集合进行管理
  • 7.7.3. 如果系统以不受约束的方式创建线程,最终会耗尽内存,导致系统崩溃

7.8. 同步屏障

  • 7.8.1. CountDownLatch是一个简单的同步屏障器

    • 7.8.1.1. 它是一次性工具,初始化值无法重置

8. 线程引入的问题

8.1. 并发编程的基本问题是如何协调多个线程的执行,无论它们以何种顺序执行,都会产生正确的结果

8.2. 鉴于线程可以不确定地被启动和抢占,任何中等复杂的程序本质上都有无数种执行顺序

  • 8.2.1. 这些系统是不容易测试的

8.3. 所有并发程序都需要避免两个基本问题,即竞态条件和死锁

8.4. 竞态条件

  • 8.4.1. 如果每个线程都只做自己的事情并且完全独立,执行顺序就不是问题了

  • 8.4.2. 完全独立的线程并不是大多数多线程系统的行为方式

  • 8.4.3. 线程可以使用共享的数据结构来协调它们的工作并在线程之间传递状态

  • 8.4.4. 竞态条件是隐秘的、狡猾的错误,因为它们通常很少见,而且很难被发现,大多数时候结果都是正确的

    • 8.4.4.1. 相同的代码,偶尔会出现不同的结果

    • 8.4.4.2. 关键是识别和保护临界区

    • 8.4.4.3. 临界区是更新共享数据结构的一段代码,如果它被多个线程访问,则必须以原子方式执行

    • 8.4.4.4. 你应该使临界区代码尽可能少,将序列化代码减到最少

8.5. 死锁

  • 8.5.1. 如果我们不小心编写过多限制不确定性的代码,则又会导致程序停止运行,并且永远不会继续执行,术语称其为死锁

  • 8.5.2. 当两个或多个线程永远被阻塞,没有一个可以继续执行时,就会发生死锁

    • 8.5.2.1. 当线程需要独占共享资源集,以不同的顺序获取锁时,就会发生这种情况
  • 8.5.3. 死锁,也称为致命拥抱,会导致程序停止

  • 8.5.4. 可以在软件的阻塞操作上使用超时来实现

    • 8.5.4.1. 在超时到期后,一个线程释放临界区并重试,让其他被阻塞的线程有机会继续执行

    • 8.5.4.2. 阻塞线程会损害性能,设置超时值也不是精确的做法

  • 8.5.5. 对于循环等待死锁,可以在共享资源上施加资源分配协议来解决,这样线程就不会总是以相同的顺序请求资源了

9. 线程间的协调

9.1. 很多时候,我们需要不同角色的线程来协调它们的活动,继而解决问题

9.2. 打印问题就是典型的生产者-消费者的例子

  • 9.2.1. 与一切现实的资源一样,缓冲区的容量也是有限的

  • 9.2.2. 轮询,或忙等待

  • 9.2.3. 更好的解决方案是让生产者和消费者阻塞,直到其期望的操作(分别为put或get)成功

  • 9.2.4. 阻塞的线程不消耗资源,这是一个有效的解决方案

10. 线程安全集合

10.1. java.util包中的集合并不是线程安全的

  • 10.1.1. 为了加快单线程程序的执行速度,该集合不是线程安全的

10.2. 在多线程代码中使用线程安全集合总是更安全

  • 10.2.1. ConcurrentHashMap的迭代器是弱一致性

  • 10.2.2. 如果你需要一个在被多个线程更新时始终反映当前hashmap状态的迭代器,就要付出性能代价,ConcurrentHashMap不是正确的选择

相关文章:

读构建可扩展分布式系统:方法与实践15可扩展系统的基本要素

1. 可扩展系统的基本要素 1.1. 分布式系统在本质上就是复杂的,你必须考虑多种故障模式,并设计应对所有可能发生的情况的处理方式 1.2. 大规模应用程序需要协调大量的硬件和软件组件,共同实现低延迟和高吞吐量的能力 1.3. 面临的挑战是将所…...

解决VisualStudio msvsmon.exe远程调试器未启动问题

原本好好的用本地调试器编译运行程序,结果VisualStudio不知道哪根筋抽风了,死活就是无法运行程序。 心想是不是程序问题,结果直接运行程序没问题。 心想是不是msvsmon.exe是个后台服务,结果死活找不到这个服务,然后再…...

如果淘汰是注定的,那么读书还有意义吗?

哪吒说:“我命由我不由天,是魔是仙我自己说了算。”; 而且书中自有颜如玉,书中自有黄金屋; 抛开以上说法,有一句话说的也特别好:“人这一辈子,赚不到自己认知以外的钱,没…...

Python 中 三种常用的绘图方式 ! ! !

一 Matplotlib可视化 在Python中,Matplotlib是一个功能强大的绘图库,特别是其Pyplot模块,提供了类似于MATLAB的绘图接口,使得用户可以轻松绘制各种2D图表。下面我们将详细介绍使用Matplotlib进行可视化的基本步骤以及常用图形的…...

统一回复OneAPI:failed to get gpt-3.5-turbo token encoder的解决办法

源码方式安装后启动OneAPI时提示failed to get gpt-3.5-turbo token encode,缺少编码文件的解决办法。 1、编辑encoding.go文件 vim /root/go/pkg/mod/github.com/pkoukk/tiktoken-gov0.1.7/encoding.go 注意:tiktoken-gov0.1.7要根据实际情况&#x…...

Flash Attention是怎么做到又快又省显存的?

Flash Attention 并没有减少 Attention 的计算量,也不影响精度,但是却比标准的Attention运算快 2~4 倍的运行速度,减少了 5~20 倍的内存使用量。究竟是怎么实现的呢? Attention 为什么慢? 此处的“快慢”是相对而言的…...

CAN报文ID过滤

在CAN通信中,CAN_FILTERMODE_LIST和CAN_FILTERMODE_MASK是用于CAN过滤器配置的两种不同过滤模式。 1. CAN_FILTERMODE_LIST: - 当CAN过滤器使用CAN_FILTERMODE_LIST模式时,过滤器将匹配通过滤器的标识符列表中的任何一个标识符。换句话说…...

ELK-05-skywalking监控SpringCloud服务日志

文章目录 前言一、引入依赖二、增加日志配置文件三、打印日志四、skywalking网页查询链路五、日志收集5.1 修改logback-spring.xml5.2 重启SpringCloud服务并请求test接口5.3 查看skywalking网页的Log 总结 前言 基于上一章节,现在使用skywalkin监控SpringCloud服务…...

17年数据结构考研真题解析

第一题&#xff1a; 解析&#xff1a; 我们说递归要找出口&#xff0c;这道题的出口是sum<n&#xff0c;经过观察可以得知&#xff1a;sum123。。。k 设第k次循环跳出&#xff0c;则有sum123。。。k<n k<,很显然答案选B 第二题&#xff1a; 解析&#xff1a; 第一句&a…...

nginx 安装(Centos)

nginx 安装-适用于 Centos 7.x [rootiZhp35weqb4z7gvuh357fbZ ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.9.2009 (Core) Release: 7.9.2009 Codename: Core# 创建文件…...

异步编程利器:深入解析 Python 异步并发库 Gevent

在现代 Python 应用开发中&#xff0c;并发编程 是提高程序性能、处理多个任务的关键手段之一。虽然 Python 有原生的多线程、多进程模块&#xff0c;但这些模块存在一些限制&#xff0c;比如全局解释器锁&#xff08;GIL&#xff09;会影响多线程程序的执行效率。此外&#xf…...

Python pyusb 使用指南【windows+linux】

前言&#xff1a;USB(通用串行总线)作为一种高度通用性的硬件接口&#xff0c;在诸多领域均有应用。在C中可以直接使用libusb库即可完成USB设备信息查询、USB设备监听、与USB设备控制端点、数据&#xff08;同步、批量、中断&#xff09;端点进行指令、数据交互等功能。python中…...

Xcode报错:The request was denied by service delegate (SBMainWorkspace)

Xcode报错&#xff1a;The request was denied by service delegate (SBMainWorkspace) 造成的原因: &#xff08;1&#xff09;新的M2芯片的Mac电脑 (2) 此电脑首次安装启动Xcode的应用程序 (3&#xff09;此电脑未安装Rosetta 解决方法: &#xff08;1&#xff09;打开终端…...

面试系列-携程暑期实习一面

Java 基础 1、Java 中有哪些常见的数据结构&#xff1f; 图片来源于&#xff1a;JavaGuide Java集合框架图 Java 中常见的数据结构包含了 List、Set、Map、Queue&#xff0c;在回答的时候&#xff0c;只要把经常使用的数据结构给说出来即可&#xff0c;不需要全部记住 如下&…...

你以为建站很复杂?Baklib 5分钟解决你的痛点

你以为建站很复杂&#xff1f;Baklib 5分钟解决你的痛点&#xff01; 在这个“快节奏”的互联网时代&#xff0c;想要快速搭建一个网站是很多人的刚需。今天我要介绍的&#xff0c;就是如何利用Baklib的CMS/Wiki模板&#xff0c;五分钟内让你的网站“横空出世”。废话不多说&am…...

极狐GitLab 17.4 重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

LVS-DR实战案例,实现四层负载均衡

环境准备&#xff1a;三台虚拟机&#xff08;NET模式或者桥接模式&#xff09; 192.168.88.200 &#xff08;web1&#xff09;(安装nginx服务器作为测试) 192.168.88.201 &#xff08;服务器&#xff09;&#xff08;用于部署lvs-dr&#xff09; 192.168.88.202 (web2)…...

网游和3A类型游戏的CPU选择分析

目录 1. CPU性能基础 1.1 主频 1.2 三级缓存&#xff08;L1、L2、L3缓存&#xff09; 1.3 架构 1.4 单核与多核性能 2. 游戏类型分析 2.1 网游&#xff1a;以《永劫无间》为例 多核性能需求&#xff1a; 单核性能需求&#xff1a; CPU选择建议&#xff1a; 2.2 3A类…...

2024免费录屏软件的宝藏功能与实用技巧

在手机上操作很多时候为了记录方便都直接截图或者录屏&#xff0c;其实电脑也一样。现在面向电脑的录屏工具纷繁复杂&#xff0c;很容易让我们挑花了眼。今天这篇文章我将介绍几款免费的录屏软件为大家提供参考。 1.福昕录屏大师 链接达达&#xff1a;www.foxitsoftware.cn/R…...

linux---进程程序替换详解

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、程序替换的原理 我们可以创建子进程通过程序替换&#xff0c;来执行不同的程序。程序替换不会重新创建子进程&#xff0c;我们通过程序替换函数&#xff0c;内核将磁盘中的可执行程序和数据加载到内存…...

笔试编程-百战成神——Day01

1.数字统计 题目来源&#xff1a;数字统计——牛客网 测试用例 算法原理 根据题目我们知道&#xff0c;首先要输出两个数字确定一个区间&#xff0c;寻找这个区间内数字中所有包含2的个数&#xff0c;比如12包含一个2,22包含两个2&#xff0c;以此类推&#xff0c;所以我们的…...

Qt+toml文件读写

Qttoml 使用 cpptoml 库示例Qt 项目中的代码示例 解释注意事项 在Qt中使用TOML&#xff08;Tom’s Obvious, Minimal Language&#xff09;格式的文件&#xff0c;可以通过第三方库来实现&#xff0c;例如 cpptoml。TOML是一种易于阅读和写入的配置文件格式&#xff0c;与JSON…...

浅谈C++之指针

一、基本介绍 在C中&#xff0c;指针是一种复杂的数据类型&#xff0c;它存储了另一个变量的内存地址。通过指针&#xff0c;程序可以直接访问和操作内存&#xff0c;这为编程提供了极大的灵活性和效率&#xff0c;但同时也增加了复杂性和潜在的错误风险。 二、指针的概念 指针…...

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…...

Apache Iceberg构建高性能数据湖

1. 概述 大数据时代的挑战 随着信息技术和互联网的迅猛发展&#xff0c;我们正处于一个数据爆炸的时代。企业和组织每天都在生成和收集海量的数据&#xff0c;这些数据来自于社交媒体、物联网设备、传感器、交易系统等各种来源。如何高效地存储、管理和分析这些庞大的数据集&…...

【图像压缩与重构】基于标准+改进BP神经网络

课题名称&#xff1a;基于标准改进BP神经网络的图像压缩与重构&#xff08;带GUI) 代码获取方式(付费&#xff09;&#xff1a; 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a; 1. 基于标准BP神经网络的图…...

函数式编程(以Python编程语言为例)介绍

函数式编程&#xff08;以Python编程语言为例&#xff09;介绍 何为函数式编程&#xff1f; 函数式编程&#xff08;Functional Programming&#xff09;&#xff0c;不要误以为就是用函数编程。函数式编程确实涉及使用函数&#xff0c;但它不仅仅是“用函数编程”那么简单。 …...

银河麒麟操作系统中查看动态库函数的方法

银河麒麟操作系统中查看动态库函数的方法 1、查看单个动态库中的函数2、查找特定函数位于哪个动态库中 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux系统&#xff0c;包括银河麒麟操作系统中&#xff0c;动态库&#xff08;.so文件…...

开放麒麟openkylin

开源社区&#xff1a; openKylin: openKylin 社区的愿景是&#xff1a;在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区。 下载地址&#xff1a; openKylin开源操作系统 安…...

用Python与OpenCV的实践:实时面部对称性分析

目录 思路分析 整体代码 效果展示 总结 在当今计算机视觉领域&#xff0c;人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用&#xff0c;还是美学研究&#xff0c;人脸特征的提取和分析都是关键技术之一。在这篇博客中&#xff0c;我们将深入探讨一个有趣的…...