我用 Java 编写了一个 Vert.x HTTP 服务器。当客户端发送请求的速度快于服务器处理请求的速度时,服务器端请求队列会慢慢填满。最终 JVM 由于所有累积的请求而耗尽内存。
我可以设置 Vert.x 请求队列的容量吗?
我想设置以下一项或多项:
- 排队请求的最大数量
- 所有排队请求的最大大小(以字节为单位)
当传入请求违反其中任何一个限制时,我想立即回复503 Service Unavailable
.
AFAIK 没有内置的方法可以实现这一点。然而,这种类型的背压仍然可以通过正常方式实现。您采取的方法是这样的:
当收到 HTTP 请求时,立即通过消息将请求转发到事件总线上的单独请求处理 verticle,并增加未完成的请求计数器。
在该 verticle 中执行请求处理逻辑,并在完成后响应事件总线消息。
一旦 HTTP 服务器 verticle 收到来自请求处理程序 verticle 的响应,就会减少请求计数器并发送适当的响应。
向您的 HTTP 服务器处理程序添加请求计数器检查,以检查未完成的请求计数,并在队列变得太大时以适当的错误进行响应。
这是 Vert.x 中的常见模式,本质上只是将请求处理逻辑与 HTTP 请求处理程序分开。将事件总线上的请求作为 JsonObject 转发可确保请求在事件总线中快速排队。您可以使用该队列来计算未完成请求的数量,如我所示。
另请注意,您可以跨多个 Verticle 实例扩展 HTTP 服务器,以便处理更多请求。在这种情况下,您可以使用静态变量或共享数据在实例之间共享信号量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)