我用Java编写了一个Vert.x HTTP服务器。当客户端发送的请求速度超过服务器可以处理的速度时,服务器端请求队列会慢慢填满。最终,由于所有累积请求,JVM内存不足。
我可以在Vert.x请求队列中设置容量吗?
我想设置以下一项或多项:
当传入的请求违反了这些限制中的任何一个时,我想立即回复503 Service Unavailable
。
答案 0 :(得分:4)
AFAIK没有内置的方法来实现这一目标。但是,这种背压仍应通过常规方法实现。你采取的方法是:
收到HTTP请求后,立即通过消息将请求转发给事件总线上的单独请求处理Verticle并增加未完成的请求计数器。
在该Verticle中执行请求处理逻辑,并在完成后响应事件总线消息。
一旦HTTP服务器Verticle收到请求处理程序Verticle的响应,就递减请求计数器并发送相应的响应。
向HTTP服务器处理程序添加请求计数器检查以检查未完成的请求计数,并在队列变得过大时以适当的错误响应。
这是Vert.x中的一种常见模式,它基本上只是将请求处理逻辑与HTTP请求处理程序分开。作为JsonObject在事件总线上转发请求可确保请求在事件总线中快速排队。您使用该队列来计算我显示的未完成请求的数量。
另请注意,您可以跨多个Verticle实例扩展HTTP服务器,以便处理更多请求。在这种情况下,您可以使用静态变量或共享数据来跨实例共享信号量。