菜单

通信

相关源文件

本页介绍分布式系统间通信所使用的各种协议和架构风格。理解这些基础知识对于设计可伸缩系统至关重要,因为系统组件需要在网络中有效且高效地进行交互。

有关消息队列等异步通信模式的信息,请参阅异步性

通信模型概述

在分布式系统中,组件需要在网络中交换信息。不同的通信协议和架构风格在可靠性、性能和实现简易性方面提供了各种权衡。

来源:README.md164-168

传输层协议

传输控制协议 (TCP)

TCP 是一种面向连接的协议,可在通过 IP 网络通信的主机上运行的应用程序之间提供可靠、有序且经过错误检查的数据传输。

TCP 的主要特点

  • 基于连接(需要握手)
  • 保证数据包交付
  • 数据包按顺序到达
  • 流量控制和拥塞控制
  • 错误检测和纠正
  • 与 UDP 相比开销更高

何时使用 TCP

  • 当你需要所有数据无损到达时
  • 当数据需要按发送顺序到达时
  • 适用于需要高可靠性的应用程序(Web 服务器、数据库连接、电子邮件、文件传输)

来源:README.md165-166 README-ja.md1351-1376

用户数据报协议 (UDP)

UDP 是一种无连接协议,提供最小的传输服务,不保证交付、排序或重复保护。

UDP 的主要特点

  • 无连接(无需握手)
  • 不保证数据包交付
  • 无数据包排序
  • 无拥塞控制
  • 与 TCP 相比开销更低
  • 允许向多个目的地广播

何时使用 UDP

  • 当速度比可靠性更重要时
  • 适用于可容忍部分数据丢失的时间敏感应用程序
  • 适用于 VoIP、视频流、在线游戏和 DNS 查询等应用程序

TCP 与 UDP 比较

功能TCPUDP
连接面向连接无连接
可靠性保证交付尽力而为交付
排序保持顺序不保证顺序
速度因开销而较慢更快
报头大小20-60 字节8 字节
流量控制
用例Web、电子邮件、文件传输流媒体、DNS、VoIP

来源:README.md167 README-ja.md1377-1405

应用层通信范式

远程过程调用 (RPC)

RPC 是一种协议,允许一台计算机上的程序在另一台计算机上执行过程,而无需明确编写远程交互的详细信息。

RPC 的主要特点

  • 使远程过程调用看起来像本地调用
  • 通常是同步的(客户端等待响应)
  • 通常是特定于语言的或需要接口定义语言
  • 流行的实现包括 gRPC、Thrift 和 Avro
  • 侧重于操作/行为而非资源

RPC 调用示例

GET /someoperation?data=anId

POST /anotheroperation
{
  "data":"anId";
  "anotherdata": "another value"
}

何时使用 RPC

  • 用于内部服务间通信
  • 当性能至关重要时
  • 当操作与 REST 资源不完全匹配时
  • 适用于需要多个参数的复杂操作

来源:README.md167 README-ja.md1406-1453

表述性状态转移 (REST)

REST 是一种用于分布式超媒体系统的架构风格,其特点是客户端-服务器关系,客户端通过 URI 标识的资源进行请求操作。

REST 的主要特点

  • 面向资源(而非面向操作)
  • 无状态通信
  • 使用标准 HTTP 方法(GET, POST, PUT, DELETE, PATCH)
  • 响应状态码传达结果
  • 超媒体即应用状态引擎 (HATEOAS)
  • 自描述消息

REST 调用示例

GET /someresources/anId

PUT /someresources/anId
{"anotherdata": "another value"}

REST 的关键原则

  1. 通过 URI 识别资源 - 资源上的每次操作使用相同的 URI
  2. 通过表述操作资源 - 使用 HTTP 动词、请求头和请求体
  3. 自描述消息 - 使用标准 HTTP 状态码
  4. HATEOAS(超媒体即应用状态引擎) - 允许通过链接进行 API 导航

何时使用 REST

  • 用于公共 API
  • 当你的数据自然地符合资源模型时
  • 当你希望利用 HTTP 基础设施(如缓存等)时
  • 当你需要一个标准、被广泛理解的接口时

来源:README.md168 README-ja.md1454-1509

RPC 与 REST 比较

RPC 与 REST 操作比较

操作RPCREST
注册POST /signupPOST /persons
读取个人信息GET /readPerson?personid=1234GET /persons/1234
读取个人物品列表GET /readUsersItemsList?personid=1234GET /persons/1234/items
向个人物品中添加物品POST /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
}
POST /persons/1234/items
{
"itemid": "456"
}
更新物品POST /modifyItem
{
"itemid": "456";
"key": "value"
}
PUT /items/456
{
"key": "value"
}
删除物品POST /removeItem
{
"itemid": "456"
}
DELETE /items/456

来源:README.md1485-1495 README-ja.md1486-1495

选择合适的通信协议

选择通信协议时要考虑的因素

  1. API 的受众

    • 面向公众服务 vs 内部服务
    • 开发者体验考量
  2. 性能要求

    • 延迟敏感性
    • 带宽限制
    • 网络可靠性
  3. 数据模型

    • 面向资源的数据(非常适合 REST)
    • 面向操作的业务(非常适合 RPC)
  4. 所需的协议特性

    • 可靠性 (TCP)
    • 低延迟 (UDP)
    • 流式支持
    • 双向通信

来源:README.md1500-1509

总结

通信协议是分布式系统的基础。理解不同协议之间的权衡,使系统设计者能够根据其特定需求选择合适的方法。

  • TCP 提供可靠性和顺序保证,但代价是更高的延迟。
  • UDP 提供更低的延迟,但牺牲了可靠性保证。
  • RPC 专注于暴露行为和功能,为内部服务通信进行了优化。
  • REST 专注于资源和标准接口,是公共 API 和利用 HTTP 基础设施的理想选择。

在设计系统时,必须根据应用程序的特定需求选择合适的通信范式,同时考虑可靠性需求、性能限制以及数据和操作的自然结构等因素。

来源:README.md164-168 README-ja.md1321-1509