# 分布式系统的技术栈

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

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

## 提高架构的性能

### 缓存设计

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

### 负载均衡

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

### 异步调用

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

### 数据镜像

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

### 数据分区

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

## 提高架构的稳定性

### 服务拆分

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

### 服务冗余

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

### 限流降级

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

### 高可用架构

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

### 高可用运维

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

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

### 服务治理

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

### 架构软件管理

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

### DevOps

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

### 自动化运维

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

### 资源调度管理

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

### 整体架构监控

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

### 流量控制

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

## 参考资料

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.fantasticmao.cn/tech/fen-bu-shi-xi-tong/fen-bu-shi-xi-tong-de-ji-shu-zhan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
