为 Netty 服务器上的 Spring 响应式 Web 应用程序定义最大并发用户数

Defining the maximum number of concurrent users for a Spring Reactive Web application on a Netty Server

Spring Webflux,使用 Reactor 项目在以更有效的方式使用资源方面非常有前途。然而,如何计算支持一定数量用户所需的资源远非显而易见。

在构建将在 Tomcat 上 运行 的标准 Web 应用程序(非 Reactive)时,您可以简单地定义支持用户所需的 Web 线程数。但是,这似乎不计入 Spring 响应式 Web 应用程序。使用了少量的线程,使用了更少的内存,但是在过去你可以只定义 "X webthreads available per server" 的地方这似乎不可能做到。让我们的 sysops 和 devops 朋友有点不高兴。

这个问题的解决方案是什么?因为很难 "sell" 反应式解决方案,当它不是很确定时可能会崩溃。

我知道服务器线程可以像任何其他指标一样作为衡量要分配给服务器的资源量的指标。这适用于 "one request per thread model",但也有其自身的限制。您如何衡量效率:

  • 服务器发送事件之类的持久连接?
  • "slow clients",读取 HTTP 响应真的很慢吗?
  • 等待阻塞的线程数I/O(例如进行远程 REST 调用)

在这些情况下,您使用的是服务器线程,但并未真正使用服务器资源。然后你可以越来越多地增加这个数字,直到你的服务器在线程之间切换上下文比做实际工作更忙。

最终您使用该指标来表达 "this is the number of users a server instance can talk to while still having a reasonable latency for our use case"。

根据您的用例,Spring MVC 应用程序的性能可能优于 WebFlux 应用程序:例如,延迟和缓慢的客户端在您的应用程序中并不是真正的问题。或者 WebFlux 应用程序可能比 Spring MVC 应用程序更具预测性:您的应用程序在负载下可以很好地扩展,并且当它达到一定的并发水平时延迟不会突然爆炸。

TL;DR

没有什么比使用 实际流量 和查看第 95 个百分位数的延迟来对您的应用程序进行基准测试更好的了。