菜单

分布式系统

相关源文件

此页面概述了 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

分布式系统中的消息队列

消息队列是分布式系统的基本组件,支持服务之间的异步通信。 它们提供以下几个好处

  1. 解耦:服务不需要直接了解彼此
  2. 缓冲:吸收流量高峰并防止服务过载
  3. 可靠性:消息会持续存在,直到处理完成
  4. 可扩展性:消息生产者和消费者可以独立扩展

RocketMQ 架构

RocketMQ 是一个分布式消息传递和流式传输平台,具有低延迟、高性能和高可靠性。 它广泛用于分布式系统中,用于服务解耦和事件驱动架构。

图表:RocketMQ 架构

来源:docs/high-performance/message-queue/rocketmq-questions.md

消息队列模式

消息队列支持多种消息传递模式

  1. 点对点:每条消息只有一个生产者和一个消费者
  2. 发布/订阅:消息广播给所有订阅的消费者
  3. 请求/回复:将异步消息传递与请求-响应模式结合起来
  4. 工作队列:任务在多个工作者之间分配以进行负载均衡

来源:docs/high-performance/message-queue/rocketmq-questions.md

分布式系统中的数据管理

读写分离

读写分离是一种用于扩展数据库操作的技术,方法是将读写操作定向到不同的数据库服务器。

图表:读写分离架构

主数据库处理所有写操作,而从数据库复制主数据库中的数据并服务于读操作。 这种方法提供以下几个好处

  1. 提高性能:将数据库负载分配到多台服务器上
  2. 增强可用性:如果主服务器发生故障,从服务器仍然可以提供读操作
  3. 提高可扩展性:随着读取需求的增加,添加更多读取副本

来源:docs/high-performance/read-and-write-separation-and-library-subtable.md

数据库分库分表

数据库分片涉及将大型数据库分解为更小、更易于管理的部分,称为分片,分布在多个服务器上。

图表:数据库分片方法

分片类型

  1. 垂直分片:按功能将表拆分到不同的数据库中
  2. 水平分片:将来自同一表的数据拆分到不同的数据库中

常见的分片算法

  • 基于哈希:在键上使用哈希函数来确定分片
  • 基于范围:根据值范围划分数据
  • 基于目录:使用查找服务将键映射到分片
  • 地理位置:按地理位置对数据进行分片

来源:docs/high-performance/read-and-write-separation-and-library-subtable.md

分布式系统协调

分布式 ID 生成

分布式系统需要全局唯一的标识符来标识用户、订单和事务等实体。 传统的自动递增 ID 在分布式环境中不起作用。

图表:分布式 ID 生成策略

常用方法

  1. 数据库解决方案:

    • 自动递增键
    • 预分配的 ID 段
  2. 算法解决方案:

    • UUID/GUID
    • 雪花算法(时间戳 + 工作节点 ID + 序列号)
  3. 专用 ID 生成服务:

    • Leaf (美团)
    • UidGenerator (百度)
    • Tinyid (滴滴)

来源: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 网关架构

API 网关的主要功能

  1. 请求路由:将客户端请求定向到相应的服务
  2. API 组合:组合来自多个服务的结果
  3. 协议转换:在协议之间转换(例如,REST 到 gRPC)
  4. 身份验证和授权:集中式安全性
  5. 速率限制:保护服务免受过载
  6. 监控和日志记录:集中监控所有 API 流量

来源:docs/distributed-system/api-gateway.md

分布式系统中的高可用性

高可用性确保分布式系统在组件发生故障时保持运行。

图表:高可用性技术

主要的高可用性技术

  1. 冗余:使用冗余组件消除单点故障
  2. 容错:通过以下模式优雅地处理故障
    • 熔断器:防止级联故障
    • 舱壁:将故障隔离到系统子集
    • 超时和重试:处理瞬时故障
  3. 负载管理:
    • 速率限制:限制请求速率
    • 负载削减:在过载期间拒绝不太重要的流量
    • 反压:向上游组件发出信号以减慢速度

来源:docs/high-availability/timeout-and-retry.md, docs/high-availability/limit-request.md, docs/high-availability/high-availability-system-design.md

CAP 定理和分布式系统

CAP 定理指出,分布式数据存储不能同时提供以下三个保证中的两个以上

  • 一致性:所有节点在同一时间看到相同的数据
  • 可用性:每个请求都会收到响应,但不保证它包含最新的数据
  • 分区容错性:系统在发生网络分区时继续运行

图表:CAP 定理的权衡

在实践中,分区容错对于分布式系统至关重要,因此真正的选择是在网络分区期间的一致性和可用性之间进行选择。

来源:docs/high-performance/read-and-write-separation-and-library-subtable.md

性能和可扩展性测试

对于分布式系统,性能和可扩展性测试至关重要,以确保系统能够处理预期的负载和增长。

关键性能指标

指标描述
吞吐量单位时间内处理的请求/事务数量
响应时间响应请求所需的时间
延迟请求启动和响应开始之间的延迟
错误率导致错误的请求的百分比
资源利用率CPU、内存、网络和磁盘使用率

负载测试方法

  1. 负载测试:系统在预期负载下的行为
  2. 压力测试:系统在或超出容量时的行为
  3. 峰值测试:系统对突然负载增加的响应
  4. 耐久性测试:系统在较长时间内的行为

来源:docs/high-availability/performance-test.md

结论

分布式系统为构建可扩展、有弹性的应用程序提供了强大的功能,但它们也引入了显着的复杂性。 了解本文档中讨论的核心概念、模式和组件为有效设计和维护分布式系统奠定了基础。

有关特定分布式系统组件的深入信息,请参阅以下专门页面:消息队列和 RocketMQ高可用性设计读/写分离和分片