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

2024-09-25  本文已影响0人  躺柒
读构建可扩展分布式系统:方法与实践15可扩展系统的基本要素.png

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

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

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

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

2. 自动化

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

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

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

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

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

3. 可观测性

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

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

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

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

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

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

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

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

4. 部署平台

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

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

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

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

5. 数据湖

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

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

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

6. 并发系统

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

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

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

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

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

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

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

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

7. 线程

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

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

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

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

7.5. 线程执行顺序

7.6. 线程的状态

7.7. 线程池

7.8. 同步屏障

8. 线程引入的问题

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

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

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

8.4. 竞态条件

8.5. 死锁

9. 线程间的协调

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

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

10. 线程安全集合

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

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

上一篇下一篇

猜你喜欢

热点阅读