我已经用Java编写了Vert.x HTTP服务器。当客户端发送请求的速度快于服务器处理请求的速度时,服务器端请求队列将缓慢填满。最终,由于所有累积的请求,JVM耗尽了内存。
我可以在Vert.x请求队列上设置容量吗?
我想设置以下一项或多项:
当传入请求违反了这些限制中的任何一个时,我想立即以响应503 Service Unavailable。
AFAIK没有内置的方法可以完成此操作。但是,这种背压仍然应该可以通过常规方法实现。您采用的方法是:
收到HTTP请求后,立即通过消息将请求转发到事件总线上的单独请求处理版本,并增加未完成的请求计数器。
在该版本中执行请求处理逻辑,并在完成后响应事件总线消息。
一旦HTTP服务器垂直服务器收到了来自请求处理程序垂直计算机的响应,就递减请求计数器并发送适当的响应。
将请求计数器检查添加到HTTP服务器处理程序中,以检查未完成的请求计数,如果队列太大,则以适当的错误响应。
这是Vert.x中的一种常见模式,实际上仅将请求处理逻辑与HTTP请求处理程序分开。作为JsonObject在事件总线上转发请求,可确保请求在事件总线中快速排队。您已经使用该队列来计算未完成请求的数量,如我所示。
还要注意,您可以跨多个垂直实例扩展HTTP服务器,以处理更多请求。在这种情况下,您可以使用静态变量或共享数据在实例之间共享信号量。