> For the complete documentation index, see [llms.txt](https://gitbook.fantasticmao.cn/tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gitbook.fantasticmao.cn/tech/fen-bu-shi-xi-tong/fen-bu-shi-xi-tong-de-ji-shu-zhan.md).

# 分布式系统的技术栈

构建分布式系统的目的是增加系统容量、提供系统的可用性，对应到技术层面的具体两件事如下：

1. 提高整体架构的吞吐量，服务更多的并发和流量；
2. 提高整体系统的稳定性，让系统的可用性更高。

## 提高架构的性能

### 缓存设计

在架构设计中加入缓存系统，可以有效地提高系统的访问能力。从前端的浏览器，到网络，再到后端的服务、底层的数据库、文件系统、硬盘和 CPU，全都有着合理高效的缓存设计，这是提高快速访问能力的最有效的手段。

### 负载均衡

负载均衡是水平扩展的关键技术，它可以使用多台机器来共同分担一部分流量的请求。

### 异步调用

异步调用主要是通过消息队列来对请求做排队处理，从而削去前端的请求峰值，使后端可以通过自身能够承受的处理速度来处理请求。使用异步调用可以增加系统的吞吐量，但是系统的实时性会被降低。

### 数据镜像

数据镜像是把一个数据库镜像分成多份一样的数据，应用可以在任意节点上进行读写，各个节点之间会自动同步数据。使用数据镜像最大的问题是如何保证数据的一致性。

### 数据分区

数据分区是把数据按照一定的方式分成多个区（例如通过地址位置），不同分区的数据承担不同分区的流量。使用数据分区会导致跨库 join 和跨库事务变得非常复杂。

## 提高架构的稳定性

### 服务拆分

服务拆分主要有两个目的：为了隔离故障和重用服务模块。但是在服务拆分之后，会引入服务调用间的依赖关系。

### 服务冗余

服务冗余是为了去除单点故障，并可以支持服务的弹性伸缩、故障迁移。但是对于一些有状态的服务来说，服务冗余会带来更高的复杂性，比如在弹性伸缩时需要考虑数据的复制或者是重新分片。

### 限流降级

当系统承受不住高并发的压力时，只能通过限流或者降级的方式来停掉一部分服务、或者拒绝一部分请求，以确保整个架构不会挂掉。

### 高可用架构

高可用架构通常都是从冗余架构的角度来保证系统的可用性，比如多租户隔离、灾备多活，为了避免出现单点故障。

### 高可用运维

高可用运维是指 DevOps 中的 CI/CD。一个良好的运维模式应该是一条很流畅的软件发布管线，其中有着充分的自动化测试，还可以做相应的灰度发布，以及对线上系统的自动化控制。

## 分布式系统的关键技术

### 服务治理

服务治理的最大意义是梳理服务间的依赖关系和调用关系，并对这些服务进行性能和可用性方面的管理。涉及的技术有服务拆分、服务调用、服务发现、服务依赖等等。

### 架构软件管理

服务之间有依赖关系，并且也有兼容性问题，所以整体服务所形成的架构需要有架构版本管理、生命周期管理，以应对服务的编排、聚合、事务处理等服务调度功能。

### DevOps

分布式系统可以更快速地更新服务，因此对于服务的测试和部署要求相对较高。所以分布式系统还需要 DevOps 的全流程，包括环境构建，CI、CD 等等。

### 自动化运维

分布式系统还需要对服务进行自动伸缩、故障迁移、配置管理、状态管理等一系列的自动化运维技术。

### 资源调度管理

应用层的自动化运维需要基础层的调度支持，即云计算的 IaaS 层的计算、存储、网络资源的调度、隔离和管理。

### 整体架构监控

需要对应用层、中间件层、基础层的进行监控。

### 流量控制

负载均衡、服务路由、熔断、降级、限流等等。

## 参考资料

* [分布式系统的技术栈](https://time.geekbang.org/column/article/1512)
