我可以在 Vert.x HTTP 请求队列上设置容量吗?

Can I set a capacity on the Vert.x HTTP request queue?

我在 Java 中编写了一个 Vert.x HTTP 服务器。当客户端发送请求的速度快于服务器处理请求的速度时,服务器端请求队列就会慢慢填满。最终,由于所有累积的请求,JVM 耗尽了内存。

我可以在 Vert.x 请求队列上设置容量吗?

我想设置以下一项或多项:

当传入请求违反了这些限制中的任何一个时,我想立即回复 503 Service Unavailable

据我所知,没有内置方法可以完成此操作。然而,这种类型的背压应该仍然可以通过正常方式实现。您采用的方法是:

  • 收到 HTTP 请求后,立即通过消息将请求转发到事件总线上的单独请求处理 Verticle,并增加未完成的请求计数器。

  • 在该 Verticle 中执行请求处理逻辑,并在完成后响应事件总线消息。

  • 一旦 HTTP 服务器 Verticle 收到来自请求处理程序 Verticle 的响应,减少请求计数器并发送适当的响应。

  • 向您的 HTTP 服务器处理程序添加请求计数器检查以检查未完成的请求计数,并在队列增长太大时以适当的错误响应。

这是 Vert.x 中的一种常见模式,本质上只是将请求处理逻辑与 HTTP 请求处理程序分开。将事件总线上的请求作为 JsonObject 转发可确保请求在事件总线中快速排队。您可以使用该队列来计算未完成请求的数量,如我所示。

另请注意,您可以跨多个 Verticle 实例扩展 HTTP 服务器以处理更多请求。在这种情况下,您可以使用静态变量或共享数据来跨实例共享信号量。