3

给定以下代码(使用 Spring Webflux 和 RSocket):

@MessageMapping("hello.{name}")
public Mono<String> greet(@DestinationVariable String name) {
    return Mono.just("Hello " + name); // or assume this is making a slow http call
}

问题是:

  1. 当服务器负载很重时,客户端是否只是将请求发送到服务器并且服务器会缓冲该请求?或者实际上是否有某种机制让客户端等到服务器向客户端发送信号?

  2. 如果客户端仍然发送请求,那么在某些时候服务器将内存不足来缓冲所有多余的请求。我们一般是怎么处理的?netifi 经纪人可以在这种情况下提供帮助吗?(假设它是突发流量,我们无法及时扩展或扩展服务器)

4

1 回答 1

3

RSocket 的真正弹性

RSocket 作为一种网络协议,作为一等公民具有弹性。在 RSocket 中,Resilience 属性以两种方式公开:

通过流量控制(又名背压)实现弹性

如果您进行流式传输,您的订阅者可以控制传递的元素数量,因此您的订阅者不会被服务器淹没。下面的动画展示了响应流规范是如何在 RSocket 协议级别上实现的:

RSocket 和反应式流

正如它可能注意到的那样,在 Reactive Streams 中,Subscriber(左侧)request的数据通过 its Subscription,这个请求被转换成一个二进制帧,通过网络发送,一旦接收者接收到该帧,它就会解码它然后传递到远程站点上的相应订阅,以便远程发布者可以生成确切数量的消息。

通过租赁恢复弹性

另一方面,与流媒体一起,通常管理多个连接的服务器必须面对负载,并且在失败的情况下,它应该能够阻止任何进一步的交互。为此,RSocket 带来了一个内置的协议特性,称为Leasing. 简而言之,Leasing它是协议速率限制的内置功能,其中请求限制是动态的,并且完全由响应方控制。

在该过程中可能会区分一些短语:

  1. 设置阶段——这个阶段发生在客户端连接到服务器时,双方都必须提供特定的标志以同意他们双方都准备好尊重租赁。
  2. 沉默阶段——在那个阶段,请求者不能做任何事情。存在严格的关系——请求不允许做任何事情,除非响应者允许这样做。如果 Requester 尝试发送任何请求,则此类请求将立即失败,而不会向远程发送任何帧
  3. 租约供应阶段——一旦响应者同意其容量并准备好接收来自请求者的请求,它就会发送一个名为 的特定帧Lease。该框架包含 2 个关键值:Number of RequestsTime to Live. 第一个值告诉请求者它可以发送给响应者的请求数。第二个值表示这种津贴的有效期。因此,如果请求者到那时还没有使用所有这些,则该配额将被视为无效,并且请求者 sied 将拒绝任何进一步的请求。

下面的动画描述了这种交互:

RSocket 和租赁

笔记

租约策略是per connection基于基础的,这意味着如果您发出租约,您会为单个特定的远程请求者发出它,而不是为连接到您的服务器的所有请求者发出它。另一方面,数学可以应用于在所有连接的请求者之间共享整个服务器容量,这取决于一些指标等。

在哪里可以找到两者的示例

有几个很好的示例演示了如何将流控制和租赁与 RSocket 一起使用。所有这些都可以在 RSocket-Java 项目的官方 git repo 中找到

于 2020-09-27T10:23:08.523 回答