Spring Reactive Webclient 的请求级背压?

Joh*_*han 3 spring spring-boot project-reactor spring-webflux

这类似于如何做 akka-http 请求级背压?但对于 Spring 回声系统。

我正在考虑如何在以反应方式使用 Spring WebClient 时为 HTTP 客户端实现背压。对我来说,这听起来像是让 WebClient 意识到 HTTP 语义并对例如状态“429 - 请求过多”施加反压。我没有找到任何关于此的文档,这让我有点怀疑这是否是要走的路。

问题:

  1. 基于 HTTP 响应标头的背压是否有意义(例如,基于 429 或 503 状态代码和Retry-After标头)?或者是否有更好的方法通过 HTTP为非流式(请求-响应)用例进行背压?
  2. 是否在 Webclient 或其他一些与 Spring 反应式回声系统配合良好的库中实现了这样的功能?
  3. 如果当前不存在这样的情况并且考虑到它是有道理的,那么简单地使用Retry-After标头中设置的超时重试是否有意义?

Bri*_*zel 5

TL;DR:Spring Framework 和 Reactor Netty 不提供这种支持,我不知道有任何库可以做到这一点。

您可以使用 来实现您所描述的行为,该行为在WebFilter传入请求被分派给处理程序之前拦截传入请求,并使用您选择的任何 HTTP 状态/标头进行回复。

唯一棘手的部分是决定是否应该拒绝请求。您可以将固定吞吐量配置为不超过或依赖其他一些 JVM 指标吗?

现在我不会称之为“背压”,至少不是在 Spring 的上下文中。在响应式流中,背压大致意味着消费者向生产者提供有关它可以发送的消息数量的信息。根据规范,客户端不能发送超过允许数量的消息。

在 Spring 的 HTTP 上下文中,我们在接受新连接时不强制执行背压,但在读取/写入 TCP 缓冲区时会使用此信息。此信息不跨网络,因此我们在这里仅依赖 TCP 流量控制。

如果您想在协议中提供真正的背压支持,您需要在协议本身中支持这一点。这就是Spring 中未来的 RSocket 支持的全部内容。