diff --git a/rsocket/README.md b/rsocket/README.md index b130af8..5f59f5a 100644 --- a/rsocket/README.md +++ b/rsocket/README.md @@ -1,9 +1,17 @@ 原文链接: [Motivations · RSocket](http://rsocket.io/docs/Motivations) - https://github.com/rsocket/rsocket + + ## 🍎 译序 译文由阿里中间件的 [罗毅(北纬)](https://yq.aliyun.com/articles/593279) 提供,感谢翻译! +关于`RSocket`包含三部分 + +- FAQ +- [动机](README.md) +- [协议](protocol.md) + # 动机 大型分布式系统往往通过模块化的方式来构建,不同团队可能采用不同的技术和不同的编程语言来实现其中的模块。这些模块需要可靠的通讯,并支持快速独立的演进。在分布式系统中,一个至关重要、需要考虑的因素是模块之间需要具备高效可扩展的通讯机制。这个因素将会显著的影响到用户能够感受到的网络延迟、以及构建并运行系统所需要消耗的资源。 @@ -232,7 +240,7 @@ RSocket 寻求的是: 背景: * RSocket 是 OSI 5/6 层或者 TCP/IP 应用层的协议。 -* RSocket 被设计成全双工、二进制传输,并具备类似 TCP 行为的协议(更详细的描述请参阅[这里](https://github.com/RSocket/reactivesocket/blob/master/Protocol.md#transport-protocol))。 +* RSocket 被设计成全双工、二进制传输,并具备类似 TCP 行为的协议(更详细的描述请参阅[这里](protocol.md#transport-protocol))。 ### TCP & QUIC diff --git a/rsocket/protocol.md b/rsocket/protocol.md index 48efc27..8ce431e 100644 --- a/rsocket/protocol.md +++ b/rsocket/protocol.md @@ -1,3 +1,17 @@ +原文链接: [Protocol · RSocket](http://rsocket.io/docs/Protocol) - https://github.com/rsocket/rsocket + + + +## 🍎 译序 + +译文由阿里中间件的 [罗毅(北纬)](https://yq.aliyun.com/articles/593279) 提供,感谢翻译! + +关于`RSocket`包含三部分 + +- FAQ +- [动机](README.md) +- [协议](protocol.md) + # 协议 ## 状态 @@ -25,72 +39,38 @@ RSocket 假设了一种操作范式。这些假设包括: -- [协议](#%E5%8D%8F%E8%AE%AE) - - [状态](#%E7%8A%B6%E6%80%81) - - [介绍](#%E4%BB%8B%E7%BB%8D) - - [目录](#%E7%9B%AE%E5%BD%95) - - [术语](#%E6%9C%AF%E8%AF%AD) - - [版本号说明](#%E7%89%88%E6%9C%AC%E5%8F%B7%E8%AF%B4%E6%98%8E) - - [跨版本兼容性](#%E8%B7%A8%E7%89%88%E6%9C%AC%E5%85%BC%E5%AE%B9%E6%80%A7) - - [数据和元信息](#%E6%95%B0%E6%8D%AE%E5%92%8C%E5%85%83%E4%BF%A1%E6%81%AF) - - [组帧 (Framing)](#%E7%BB%84%E5%B8%A7-framing) - - [Transport 协议](#transport-%E5%8D%8F%E8%AE%AE) - - [组帧 (Framing) 协议的用法](#%E7%BB%84%E5%B8%A7-framing-%E5%8D%8F%E8%AE%AE%E7%9A%84%E7%94%A8%E6%B3%95) - - [组帧格式](#%E7%BB%84%E5%B8%A7%E6%A0%BC%E5%BC%8F) - - [Frame 头的格式](#frame-%E5%A4%B4%E7%9A%84%E6%A0%BC%E5%BC%8F) - - [处理 Ignore 标记](#%E5%A4%84%E7%90%86-ignore-%E6%A0%87%E8%AE%B0) - - [Frame 校验](#frame-%E6%A0%A1%E9%AA%8C) - - [可选的元数据头](#%E5%8F%AF%E9%80%89%E7%9A%84%E5%85%83%E6%95%B0%E6%8D%AE%E5%A4%B4) - - [Stream 标识](#stream-%E6%A0%87%E8%AF%86) - - [生成](#%E7%94%9F%E6%88%90) - - [生命周期](#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F) - - [Frame 类型](#frame-%E7%B1%BB%E5%9E%8B) - - [SETUP Frame (0x01)](#setup-frame-0x01) - - [ERROR Frame (0x0B)](#error-frame-0x0b) - - [错误码](#%E9%94%99%E8%AF%AF%E7%A0%81) - - [LEASE Frame (0x02)](#lease-frame-0x02) - - [KEEPALIVE Frame (0x03)](#keepalive-frame-0x03) - - [REQUEST_RESPONSE Frame (0x04)](#request_response-frame-0x04) - - [REQUEST_FNF (Fire-n-Forget) Frame (0x05)](#request_fnf-fire-n-forget-frame-0x05) - - [REQUEST_STREAM Frame (0x06)](#request_stream-frame-0x06) - - [REQUEST_CHANNEL Frame (0x07)](#request_channel-frame-0x07) - - [REQUEST_N Frame (0x08)](#request_n-frame-0x08) - - [CANCEL Frame (0x09)](#cancel-frame-0x09) - - [PAYLOAD Frame (0x0A)](#payload-frame-0x0a) - - [METADATA_PUSH Frame (0x0C)](#metadata_push-frame-0x0c) - - [EXT (Extension) Frame (0x3F)](#ext-extension-frame-0x3f) - - [恢复操作](#%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C) - - [假设](#%E5%81%87%E8%AE%BE) - - [隐式位置](#%E9%9A%90%E5%BC%8F%E4%BD%8D%E7%BD%AE) - - [客户端生命管理](#%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%94%9F%E5%91%BD%E7%AE%A1%E7%90%86) - - [恢复操作](#%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C-1) - - [RESUME Frame (0x0D)](#resume-frame-0x0d) - - [RESUME_OK Frame (0x0E)](#resume_ok-frame-0x0e) - - [Keepalive 位置字段](#keepalive-%E4%BD%8D%E7%BD%AE%E5%AD%97%E6%AE%B5) - - [身份标识的处理](#%E8%BA%AB%E4%BB%BD%E6%A0%87%E8%AF%86%E7%9A%84%E5%A4%84%E7%90%86) - - [连接建立](#%E8%BF%9E%E6%8E%A5%E5%BB%BA%E7%AB%8B) - - [协商](#%E5%8D%8F%E5%95%86) - - [不带 LEASE 的序列](#%E4%B8%8D%E5%B8%A6-lease-%E7%9A%84%E5%BA%8F%E5%88%97) - - [带 LEASE 的序列](#%E5%B8%A6-lease-%E7%9A%84%E5%BA%8F%E5%88%97) - - [分段和重组](#%E5%88%86%E6%AE%B5%E5%92%8C%E9%87%8D%E7%BB%84) - - [PAYLOAD Frame](#payload-frame) - - [REQUEST Frames](#request-frames) - - [Stream 序列和存活时间](#stream-%E5%BA%8F%E5%88%97%E5%92%8C%E5%AD%98%E6%B4%BB%E6%97%B6%E9%97%B4) - - [Request Response](#request-response) - - [Request Fire-n-Forget](#request-fire-n-forget) - - [Request Stream](#request-stream) - - [Request Channel](#request-channel) - - [请求方和回应方的 COMPLETE 共存](#%E8%AF%B7%E6%B1%82%E6%96%B9%E5%92%8C%E5%9B%9E%E5%BA%94%E6%96%B9%E7%9A%84-complete-%E5%85%B1%E5%AD%98) - - [请求方的错误,回应方终止](#%E8%AF%B7%E6%B1%82%E6%96%B9%E7%9A%84%E9%94%99%E8%AF%AF%E5%9B%9E%E5%BA%94%E6%96%B9%E7%BB%88%E6%AD%A2) - - [请求方的错误,回应方已经完成](#%E8%AF%B7%E6%B1%82%E6%96%B9%E7%9A%84%E9%94%99%E8%AF%AF%E5%9B%9E%E5%BA%94%E6%96%B9%E5%B7%B2%E7%BB%8F%E5%AE%8C%E6%88%90) - - [回应方错误,请求方终止](#%E5%9B%9E%E5%BA%94%E6%96%B9%E9%94%99%E8%AF%AF%E8%AF%B7%E6%B1%82%E6%96%B9%E7%BB%88%E6%AD%A2) - - [回应方错误,请求方已经完成](#%E5%9B%9E%E5%BA%94%E6%96%B9%E9%94%99%E8%AF%AF%E8%AF%B7%E6%B1%82%E6%96%B9%E5%B7%B2%E7%BB%8F%E5%AE%8C%E6%88%90) - - [请求方取消,回应方终止](#%E8%AF%B7%E6%B1%82%E6%96%B9%E5%8F%96%E6%B6%88%E5%9B%9E%E5%BA%94%E6%96%B9%E7%BB%88%E6%AD%A2) - - [流量控制](#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6) - - [Reactive Streams 语义](#reactive-streams-%E8%AF%AD%E4%B9%89) - - [租约语义](#%E7%A7%9F%E7%BA%A6%E8%AF%AD%E4%B9%89) - - [服务质量和优先级](#%E6%9C%8D%E5%8A%A1%E8%B4%A8%E9%87%8F%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7) - - [意外的处理](#%E6%84%8F%E5%A4%96%E7%9A%84%E5%A4%84%E7%90%86) +- [术语](#%E6%9C%AF%E8%AF%AD) +- [版本号说明](#%E7%89%88%E6%9C%AC%E5%8F%B7%E8%AF%B4%E6%98%8E) + - [跨版本兼容性](#%E8%B7%A8%E7%89%88%E6%9C%AC%E5%85%BC%E5%AE%B9%E6%80%A7) +- [数据和元信息](#%E6%95%B0%E6%8D%AE%E5%92%8C%E5%85%83%E4%BF%A1%E6%81%AF) +- [组帧 (Framing)](#%E7%BB%84%E5%B8%A7-framing) + - [Transport 协议](#transport-%E5%8D%8F%E8%AE%AE) + - [组帧 (Framing) 协议的用法](#%E7%BB%84%E5%B8%A7-framing-%E5%8D%8F%E8%AE%AE%E7%9A%84%E7%94%A8%E6%B3%95) + - [组帧格式](#%E7%BB%84%E5%B8%A7%E6%A0%BC%E5%BC%8F) + - [Frame 头的格式](#frame-%E5%A4%B4%E7%9A%84%E6%A0%BC%E5%BC%8F) + - [Stream 标识](#stream-%E6%A0%87%E8%AF%86) + - [Frame 类型](#frame-%E7%B1%BB%E5%9E%8B) +- [恢复操作](#%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C) + - [假设](#%E5%81%87%E8%AE%BE) + - [隐式位置](#%E9%9A%90%E5%BC%8F%E4%BD%8D%E7%BD%AE) + - [客户端生命管理](#%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%94%9F%E5%91%BD%E7%AE%A1%E7%90%86) + - [恢复操作](#%E6%81%A2%E5%A4%8D%E6%93%8D%E4%BD%9C-1) + - [身份标识的处理](#%E8%BA%AB%E4%BB%BD%E6%A0%87%E8%AF%86%E7%9A%84%E5%A4%84%E7%90%86) +- [连接建立](#%E8%BF%9E%E6%8E%A5%E5%BB%BA%E7%AB%8B) + - [协商](#%E5%8D%8F%E5%95%86) + - [不带 LEASE 的序列](#%E4%B8%8D%E5%B8%A6-lease-%E7%9A%84%E5%BA%8F%E5%88%97) + - [带 LEASE 的序列](#%E5%B8%A6-lease-%E7%9A%84%E5%BA%8F%E5%88%97) +- [分段和重组](#%E5%88%86%E6%AE%B5%E5%92%8C%E9%87%8D%E7%BB%84) +- [Stream 序列和存活时间](#stream-%E5%BA%8F%E5%88%97%E5%92%8C%E5%AD%98%E6%B4%BB%E6%97%B6%E9%97%B4) + - [Request Response](#request-response) + - [Request Fire-n-Forget](#request-fire-n-forget) + - [Request Stream](#request-stream) + - [Request Channel](#request-channel) +- [流量控制](#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6) + - [Reactive Streams 语义](#reactive-streams-%E8%AF%AD%E4%B9%89) + - [租约语义](#%E7%A7%9F%E7%BA%A6%E8%AF%AD%E4%B9%89) + - [服务质量和优先级](#%E6%9C%8D%E5%8A%A1%E8%B4%A8%E9%87%8F%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7) +- [意外的处理](#%E6%84%8F%E5%A4%96%E7%9A%84%E5%A4%84%E7%90%86) @@ -99,7 +79,7 @@ RSocket 假设了一种操作范式。这些假设包括: * __Frame__: 一个单一的消息,其中包含了一个请求、一个回应、或者协议的处理。 * __Fragment__: 一个应用消息的一部分,被分段以便可以被包含在一个 Frame 中。参见 [分段与重组](#fragmentation-and-reassembly). * __Transport__: 用于搭载 RSocket 协议的协议。WebSockets、TCP、或者 Aeron 中的一个。Transport **必须** 提供在 [transport protocol](#transport-protocol) 章节中提到的能力。 -* __Stream__: 操作单位(request/response 等)。参见[动机](Motivations.md)。 +* __Stream__: 操作单位(request/response 等)。参见[动机](README.md)。 * __Request__: 一个 stream 请求。可能是四种类型中的一个。也可以是请求更多的请求或者说取消上一次请求的请求。 * __Payload__: 一个 stream 消息(上游或者下游)。包含与上次请求创建的 stream 想关联的数据。在 Reactive Streams 和 Rx 中这代表 'onNext' 事件。 * __Complete__: 终止一个 stream 上事件的发送并示意成功完成。在 Reactive Streams 和 Rx 中代表 'onComplete' 事件。 @@ -321,7 +301,7 @@ Stream ID 的生成遵循 [HTTP/2](https://tools.ietf.org/html/rfc7540) 中的 -### SETUP Frame (0x01) +#### SETUP Frame (0x01) Setup frames **必须**始终使用 Stream ID 0,因为它们与连接相关。 @@ -378,7 +358,7 @@ __注意__: 如果服务器接受到了一个设置了 (__R__)esume Enabled 的 -### ERROR Frame (0x0B) +#### ERROR Frame (0x0B) 当某个 request/stream 发生错误时,或者连接发生错误,或者回应 SETUP frame 时,都可以使用 Error frame。 @@ -406,7 +386,7 @@ Stream ID 为 0 表示错误与连接有关,包括连接的建立。Stream ID Error Data 通常是 Exception 消息,但是也可以包含 stacktrace 信息,如果合适的话。 -#### 错误码 +##### 错误码 | 类型 | 值 | 描述 | | :-------------------- | :--------- | :--------------------------------------- | @@ -435,7 +415,7 @@ __注意__: 0x0001 - 0x00300 之间还未使用的值作为协议未来的扩展 -### LEASE Frame (0x02) +#### LEASE Frame (0x02) Lease frame **可能**由来自客户端或者服务器端的回应方发送,用来通知请求方可以发送请求的时长,以及在这段时间窗口之内可以发送的数量。详见 [租约场景](#lease-semantics)。 @@ -474,7 +454,7 @@ Frame 内容 -### KEEPALIVE Frame (0x03) +#### KEEPALIVE Frame (0x03) KEEPALIVE frame **必须**永远使用 Stream ID 0,因为其与连接相关。 @@ -513,7 +493,7 @@ Frame 内容 -### REQUEST_RESPONSE Frame (0x04) +#### REQUEST_RESPONSE Frame (0x04) Frame 内容 @@ -536,7 +516,7 @@ Frame 内容 -### REQUEST_FNF (Fire-n-Forget) Frame (0x05) +#### REQUEST_FNF (Fire-n-Forget) Frame (0x05) Frame 内容 @@ -559,7 +539,7 @@ Frame 内容 -### REQUEST_STREAM Frame (0x06) +#### REQUEST_STREAM Frame (0x06) Frame 内容 @@ -587,7 +567,7 @@ Frame 内容 -### REQUEST_CHANNEL Frame (0x07) +#### REQUEST_CHANNEL Frame (0x07) Frame 内容 @@ -623,7 +603,7 @@ A requester MUST send only __one__ REQUEST_CHANNEL frame. Subsequent messages fr -### REQUEST_N Frame (0x08) +#### REQUEST_N Frame (0x08) Frame 内容 @@ -646,7 +626,7 @@ Frame 内容 -### CANCEL Frame (0x09) +#### CANCEL Frame (0x09) Frame 内容 @@ -664,7 +644,7 @@ Frame 内容 -### PAYLOAD Frame (0x0A) +#### PAYLOAD Frame (0x0A) Frame 内容 @@ -706,7 +686,7 @@ Frame 内容 -### METADATA_PUSH Frame (0x0C) +#### METADATA_PUSH Frame (0x0C) 请求方或者回应方可以使用 Metadata Push frame 来异步发送元信息通知给它的对端。 @@ -733,7 +713,7 @@ Frame 内容 -### EXT (Extension) Frame (0x3F) +#### EXT (Extension) Frame (0x3F) 扩展 frame 的通用格式如下所示。 @@ -1234,13 +1214,13 @@ Upon reception, the stream is terminated by the Responder. 请求方可以通过在初始的 REQUEST_CHANNEL frame 中或者最后一个 PAYLOAD frame 中设置 C 标志位来表示 COMPLETE。请求方**严禁**在发送了带 C 标志位的 frame 之后再发送额外的 PAYLOAD frame。 -### 流量控制 +## 流量控制 协议提供了多种流量控制机制。 -#### Reactive Streams 语义 +### Reactive Streams 语义 [Reactive Streams](http://www.reactive-streams.org/) 语义用在 Streams,Subscriptions,以及 Channels 的流控上。这是一个基于信用的模型,请求方授信回应方可以发送的 PAYLOAD 数目。有时这个模型也被称之为 "request-n" 或者 "request(n)"。 @@ -1265,7 +1245,7 @@ Upon reception, the stream is terminated by the Responder. -#### 租约语义 +### 租约语义 LEASE 语义控制在给定时间段内请求方可以发送的请求(所有类型)数量。 @@ -1277,13 +1257,13 @@ LEASE 语义控制在给定时间段内请求方可以发送的请求(所有 -#### 服务质量和优先级 +### 服务质量和优先级 Stream 的服务质量和优先级是应用层和网络层应该考虑的,并且只有它们才能做的更好。元信息的能力,包括 METADATA_PUSH,是应用可以借助调优优先级的有效工具。 DiffServ via IP QoS 最好由底层的网络层协议来处理。 -### 意外的处理 +## 意外的处理 本协议对错误 frame 的处理持容忍态度。如果与当前上下文无关的错误**就应该**采取忽略的态度。下面是针对一些场景的进一步澄清: diff --git a/rsocket/r-socket-pink.png b/rsocket/r-socket-pink.png new file mode 100644 index 0000000..e16a20a Binary files /dev/null and b/rsocket/r-socket-pink.png differ diff --git a/rsocket/r-socket-pink.svg b/rsocket/r-socket-pink.svg new file mode 100644 index 0000000..0c6e042 --- /dev/null +++ b/rsocket/r-socket-pink.svg @@ -0,0 +1,63 @@ + + + + + + +