此页面概述了 JavaGuide 仓库中涵盖的分布式系统概念和架构。它侧重于构建可靠、可扩展和可维护的分布式系统所需的基本原则、组件和设计考虑因素。有关消息队列和 RocketMQ 等特定实现,请参阅消息队列和 RocketMQ。有关高可用性策略,请参阅高可用性设计。有关数据库扩展技术,请参阅读/写分离和分片。
分布式系统是独立计算机的集合,对用户而言,它们表现为一个单一的连贯系统。 这些系统旨在通过在多个联网计算机上分配工作负载来解决大规模计算问题,与单体系统相比,提供更高的性能、可扩展性和容错能力。
分布式系统的主要特征包括
图表:分布式系统的组件
来源:docs/high-performance/message-queue/rocketmq-questions.md, docs/high-performance/read-and-write-separation-and-library-subtable.md, docs/distributed-system/api-gateway.md
分布式系统引入了几个必须解决的挑战,以确保可靠运行
| 挑战 | 描述 | 解决方案 |
|---|---|---|
| 网络故障 | 节点之间的通信可能失败或不可靠 | 超时、重试、熔断器 |
| 延迟 | 操作需要时间才能在网络上传播 | 缓存、异步处理 |
| 部分故障 | 某些组件可能发生故障,而其他组件继续运行 | 冗余、容错模式 |
| 一致性 | 在分布式节点之间维护数据一致性 | 一致性模型、分布式事务 |
| 时钟同步 | 节点具有不同的时钟,使得基于时间的排序变得困难 | 逻辑时钟、向量时钟 |
| 可扩展性 | 系统必须扩展以处理增加的负载 | 水平扩展、负载均衡 |
| 安全 | 多个入口点增加了攻击面 | API 网关、分布式身份验证 |
来源:docs/high-availability/timeout-and-retry.md, docs/high-performance/load-balancing.md, docs/distributed-system/api-gateway.md
在同步通信中,客户端发送请求并等待响应后才继续。 这通常使用 REST API、RPC 调用或直接 HTTP 请求来实现。
图表:同步请求-响应模式
来源:docs/cs-basics/network/other-network-questions.md, docs/distributed-system/api-gateway.md
在异步通信中,服务通过消息队列进行通信,从而允许它们独立运行而无需等待响应。
图表:异步消息传递模式
来源:docs/high-performance/message-queue/rocketmq-questions.md
消息队列是分布式系统的基本组件,支持服务之间的异步通信。 它们提供以下几个好处
RocketMQ 是一个分布式消息传递和流式传输平台,具有低延迟、高性能和高可靠性。 它广泛用于分布式系统中,用于服务解耦和事件驱动架构。
图表:RocketMQ 架构
来源:docs/high-performance/message-queue/rocketmq-questions.md
消息队列支持多种消息传递模式
来源:docs/high-performance/message-queue/rocketmq-questions.md
读写分离是一种用于扩展数据库操作的技术,方法是将读写操作定向到不同的数据库服务器。
图表:读写分离架构
主数据库处理所有写操作,而从数据库复制主数据库中的数据并服务于读操作。 这种方法提供以下几个好处
来源:docs/high-performance/read-and-write-separation-and-library-subtable.md
数据库分片涉及将大型数据库分解为更小、更易于管理的部分,称为分片,分布在多个服务器上。
图表:数据库分片方法
分片类型
常见的分片算法
来源:docs/high-performance/read-and-write-separation-and-library-subtable.md
分布式系统需要全局唯一的标识符来标识用户、订单和事务等实体。 传统的自动递增 ID 在分布式环境中不起作用。
图表:分布式 ID 生成策略
常用方法
数据库解决方案:
算法解决方案:
专用 ID 生成服务:
来源:docs/distributed-system/distributed-id.md
负载均衡在多台服务器之间分配流量,以提高响应能力和可用性。
图表:负载均衡类型
负载均衡算法
| 算法 | 描述 |
|---|---|
| 轮询 | 按顺序在服务器之间轮流请求 |
| 加权轮询 | 加权轮询 |
| 与轮询类似,但具有服务器权重 | 最少连接数 |
| 将流量定向到活动连接数最少的服务器 | 最短响应时间 |
| 将流量定向到响应时间最快的服务器 | 基于哈希 |
| 根据请求属性(IP、URL 等)的哈希值进行路由 | 随机 |
来源:docs/high-performance/load-balancing.md
分布式系统依赖于各种网络协议进行通信
| 协议 | 层 | 在分布式系统中的用途 |
|---|---|---|
| HTTP/HTTPS | 应用程序 | RESTful API 通信、Web 界面 |
| HTTP/2 | 应用程序 | 改进的 HTTP,具有多路复用和服务器推送 |
| HTTP/3 (QUIC) | 应用程序 | 降低延迟,改进拥塞控制 |
| WebSocket | 应用程序 | 全双工通信通道 |
| TCP | 传输 | 可靠的、有序的数据传输 |
| UDP | 传输 | 快速、低开销的消息传递 |
| gRPC | 应用程序 | 高性能 RPC 框架 |
来源:docs/cs-basics/network/other-network-questions.md, docs/cs-basics/network/other-network-questions2.md
API 网关是分布式系统中客户端请求的入口点,负责处理路由、组合和协议转换。
图表:API 网关架构
API 网关的主要功能
来源:docs/distributed-system/api-gateway.md
高可用性确保分布式系统在组件发生故障时保持运行。
图表:高可用性技术
主要的高可用性技术
来源:docs/high-availability/timeout-and-retry.md, docs/high-availability/limit-request.md, docs/high-availability/high-availability-system-design.md
CAP 定理指出,分布式数据存储不能同时提供以下三个保证中的两个以上
图表:CAP 定理的权衡
在实践中,分区容错对于分布式系统至关重要,因此真正的选择是在网络分区期间的一致性和可用性之间进行选择。
来源:docs/high-performance/read-and-write-separation-and-library-subtable.md
对于分布式系统,性能和可扩展性测试至关重要,以确保系统能够处理预期的负载和增长。
关键性能指标
| 指标 | 描述 |
|---|---|
| 吞吐量 | 单位时间内处理的请求/事务数量 |
| 响应时间 | 响应请求所需的时间 |
| 延迟 | 请求启动和响应开始之间的延迟 |
| 错误率 | 导致错误的请求的百分比 |
| 资源利用率 | CPU、内存、网络和磁盘使用率 |
负载测试方法
来源:docs/high-availability/performance-test.md
分布式系统为构建可扩展、有弹性的应用程序提供了强大的功能,但它们也引入了显着的复杂性。 了解本文档中讨论的核心概念、模式和组件为有效设计和维护分布式系统奠定了基础。
有关特定分布式系统组件的深入信息,请参阅以下专门页面:消息队列和 RocketMQ、高可用性设计和读/写分离和分片。