我可以在 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 服务器以处理更多请求。在这种情况下,您可以使用静态变量或共享数据来跨实例共享信号量。
我在 Java 中编写了一个 Vert.x HTTP 服务器。当客户端发送请求的速度快于服务器处理请求的速度时,服务器端请求队列就会慢慢填满。最终,由于所有累积的请求,JVM 耗尽了内存。
我可以在 Vert.x 请求队列上设置容量吗?
我想设置以下一项或多项:
- 最大排队请求数
- 所有排队请求的最大大小(以字节为单位)
当传入请求违反了这些限制中的任何一个时,我想立即回复 503 Service Unavailable
。
据我所知,没有内置方法可以完成此操作。然而,这种类型的背压应该仍然可以通过正常方式实现。您采用的方法是:
收到 HTTP 请求后,立即通过消息将请求转发到事件总线上的单独请求处理 Verticle,并增加未完成的请求计数器。
在该 Verticle 中执行请求处理逻辑,并在完成后响应事件总线消息。
一旦 HTTP 服务器 Verticle 收到来自请求处理程序 Verticle 的响应,减少请求计数器并发送适当的响应。
向您的 HTTP 服务器处理程序添加请求计数器检查以检查未完成的请求计数,并在队列增长太大时以适当的错误响应。
这是 Vert.x 中的一种常见模式,本质上只是将请求处理逻辑与 HTTP 请求处理程序分开。将事件总线上的请求作为 JsonObject 转发可确保请求在事件总线中快速排队。您可以使用该队列来计算未完成请求的数量,如我所示。
另请注意,您可以跨多个 Verticle 实例扩展 HTTP 服务器以处理更多请求。在这种情况下,您可以使用静态变量或共享数据来跨实例共享信号量。