为每个HTTP请求部署新的Verticle



当前在应用程序启动时,我正在部署一个vertical并调用createHttpServer(serverOptions)

我已经设置了一个request().connection().closeHandler来处理关闭的连接事件,主要是当客户端决定取消其请求时,我们会停止执行该请求。

然而,当我在同一垂直方向上设置该处理程序时,它似乎只在任何同步代码执行完毕后才执行closeHandler代码,并且我们正在等待数据库通过Futures和异步处理程序做出响应。

如果不是这样,我为每个新的HTTP请求部署一个worker vertical,它会正确地中断执行以执行closeHandler代码。

据我所知,HttpServer已经被认为可以自己处理请求的可伸缩性,因为它可以一次处理多个请求,而无需部署新的垂直服务器。从本质上讲,这听起来像是一个棘手的解决方法,一旦我们的应用程序全面启动,它可能会影响我们的线程负载或类似性质的事情。所以我的问题是:

这样做对吗?

如果没有,应该遵循什么样的正确方法或范式?

如何从垂直线内部和closeHandler内部取消垂直线的执行?我所说的取消执行,是指包括任何等待完成的期货。

为什么closeHandler在执行这种多垂直方法时只异步执行?使用正常方式,简单地使用分配的线程池执行请求会推迟closeHandler的执行,直到事件循环完成其队列,我们需要异步

我认为您需要更好地理解Vert.x。Vert.x不会根据请求启动和停止线程。眩晕是长寿的,每个眩晕在一生中都会处理多个事件,但从来不会同时发生。此外,您不应根据请求部署工作人员(或非工作人员(顶点。

您所做的是部署一个Verticles池(工作和非工作(,Vert.x在它们之间分配负载。一个HTTP服务器位于前面,它将接收请求并将其转发到要处理的vertical。

为了停止处理请求,您需要在某个地方保留一个标志,该标志是在连接关闭时设置的。然后您可以在流程中检查它并停止处理。只是不要忘记在每个请求开始时清除标志。

部署或取消部署垂直线程不会影响线程数。Vert.x使用有限大小的线程池。

取消垂直行业的部署是降低服务规模的一种手段。理想情况下,你根本不应该取消垂直市场的部署。部署或取消部署确实会对性能产生影响。

正如我前面提到的,closeHandler是一种释放资源的回调方法。

版本xFuture不提供取消方式。原因是即使Java的Future.cancel()也是一个协作操作。

作为解决此问题的一种方法,最好的方法可能是如上所述传递对AtomicBoolean的引用,并在每个同步步骤之前进行检查。不过,您仍然会被同步操作阻止。

最新更新