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

时间:2015-04-08 17:08:08

标签: java http vert.x

我用Java编写了一个Vert.x HTTP服务器。当客户端发送的请求速度超过服务器可以处理的速度时,服务器端请求队列会慢慢填满。最终,由于所有累积请求,JVM内存不足。

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

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

  • 排队请求的最大数量
  • 所有排队请求的最大大小(以字节为单位)

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

1 个答案:

答案 0 :(得分:4)

AFAIK没有内置的方法来实现这一目标。但是,这种背压仍应通过常规方法实现。你采取的方法是:

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

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

  • 一旦HTTP服务器Verticle收到请求处理程序Verticle的响应,就递减请求计数器并发送相应的响应。

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

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

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