【问题标题】:Backpressure for REST endpoints with Spring Functional Web Framework使用 Spring 功能 Web 框架的 REST 端点的背压
【发布时间】:2017-06-05 23:27:14
【问题描述】:

如果我理解正确,使用 Akka Streams 实现的 HTTP 端点通过不从用于与客户端通信的套接字中读取来向 HTTP 客户端施加背压。

对于使用 Spring 的功能 Web 框架实现的 HTTP 端点也是如此吗?

如果不是,我将如何向 HTTP 客户端发出减速信号?

【问题讨论】:

    标签: spring-web spring-webflux


    【解决方案1】:

    是的,Spring 5,带有它的 Web Reactive 模块,implements the reactive streams specReactor。支持背压是其中的一部分。

    请注意,基于注释的风格和功能风格都使用相同的基础架构,只是编程模型不同。

    【讨论】:

    • 嗨,布赖恩!谢谢您的答复。我对使用 Spring 功能 Web 框架为 HTTP 端点实现背压感兴趣。据我所知,RS 规范只是关于“协议”。我在 Reactor 文档中也找不到答案。我错过了什么明显的东西吗?
    • 在 HTTP 级别,背压是通过根据请求需求读取/写入缓冲区来处理的。这意味着操作系统缓冲区可能会填满,然后远程主机将无法写入套接字。但实际上,背压信息不会通过线路传输。像github.com/reactive-streams/reactive-streams-io 这样的一些协议试图解决这个问题并在传输协议中烘焙背压信息。
    • 总结一下,以确保我理解正确:这与在 Akka HTTP 中的实现方式相同:如果下游有需求,则“Spring”从 OS 套接字读取。如果下游没有需求(例如数据库很忙),则“Spring”不会从套接字读取。当进一步的请求进来时,套接字会不断填满,如果它已满,客户端将收到超时。但是这些请求不会填满机器的内存,最终导致崩溃。
    • 我不熟悉 Akka HTTP 内部结构,所以无法确认。但是,是的,这种描述符合这种行为。
    猜你喜欢
    • 2018-04-18
    • 2019-02-04
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多