RSocket 的真正弹性
RSocket 作为一种网络协议,作为一等公民具有弹性。在 RSocket 中,Resilience 属性以两种方式公开:
通过流量控制(又名背压)实现弹性
如果您进行流式传输,您的订阅者可以控制传递的元素数量,因此您的订阅者不会被服务器淹没。下面的动画展示了响应流规范是如何在 RSocket 协议级别上实现的:

正如它可能注意到的那样,在 Reactive Streams 中,Subscriber
(左侧)request
的数据通过 its Subscription
,这个请求被转换成一个二进制帧,通过网络发送,一旦接收者接收到该帧,它就会解码它然后传递到远程站点上的相应订阅,以便远程发布者可以生成确切数量的消息。
通过租赁恢复弹性
另一方面,与流媒体一起,通常管理多个连接的服务器必须面对负载,并且在失败的情况下,它应该能够阻止任何进一步的交互。为此,RSocket 带来了一个内置的协议特性,称为Leasing
. 简而言之,Leasing
它是协议速率限制的内置功能,其中请求限制是动态的,并且完全由响应方控制。
在该过程中可能会区分一些短语:
- 设置阶段——这个阶段发生在客户端连接到服务器时,双方都必须提供特定的标志以同意他们双方都准备好尊重租赁。
- 沉默阶段——在那个阶段,请求者不能做任何事情。存在严格的关系——请求不允许做任何事情,除非响应者允许这样做。如果 Requester 尝试发送任何请求,则此类请求将立即失败,而不会向远程发送任何帧。
- 租约供应阶段——一旦响应者同意其容量并准备好接收来自请求者的请求,它就会发送一个名为 的特定帧
Lease
。该框架包含 2 个关键值:Number of Requests
和Time to Live
. 第一个值告诉请求者它可以发送给响应者的请求数。第二个值表示这种津贴的有效期。因此,如果请求者到那时还没有使用所有这些,则该配额将被视为无效,并且请求者 sied 将拒绝任何进一步的请求。
下面的动画描述了这种交互:

笔记
租约策略是per connection
基于基础的,这意味着如果您发出租约,您会为单个特定的远程请求者发出它,而不是为连接到您的服务器的所有请求者发出它。另一方面,数学可以应用于在所有连接的请求者之间共享整个服务器容量,这取决于一些指标等。
在哪里可以找到两者的示例
有几个很好的示例演示了如何将流控制和租赁与 RSocket 一起使用。所有这些都可以在 RSocket-Java 项目的官方 git repo 中找到