0

目前在应用程序启动时,我正在部署单个 Verticle 并调用createHttpServer(serverOptions).

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

但是,当我在同一个 Verticle 中设置该处理程序时,它似乎只在closeHandler任何同步代码完成执行后才执行代码,并且我们正在等待数据库通过 Futures 和异步处理程序进行响应。

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

据我了解,HttpServer 已经应该自己处理请求的可伸缩性,因为它可以一次处理许多请求,而无需部署新的 Verticle。从本质上讲,这听起来像是一个 hacky 解决方法,一旦我们的应用程序如火如荼,它可能会影响我们的线程负载或类似性质的事情。所以我的问题是:

这是这样做的正确方法吗?

如果不是,那么正确的方法或范式是什么?

你如何从它自己的 verticle 和里面取消一个 verticle 的执行closeHandler?通过取消执行,我的意思是包括任何等待完成的期货。

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

4

2 回答 2

0

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

取消部署 verticles 是缩减服务规模的一种手段。理想情况下,您根本不应该取消部署 Verticle。部署或取消部署确实会对性能产生影响。

closeHandler,前面提到过,是一个释放资源的回调方法。

Vert.xFuture不提供取消方式。原因是连Java的Future.cancel()都是合作操作

作为解决此问题的一种方法,可能会传递AtomicBoolean上面建议的引用,并在每个同步步骤之前检查它是最好的方法。但是,您仍然会被同步操作阻塞。

于 2021-04-10T09:48:55.370 回答
0

我认为您需要更好地了解 Vert.x。Vert.x 不会根据请求启动和停止线程。Verticle 寿命很长,每个在其生命周期中都处理多个事件,但从不同时处理。此外,您不应根据请求部署工作人员(或非工作人员)Verticles。

你所做的是部署一个 Verticle 池(工人和非),Vert.x 在它们之间分配负载。一个 HTTP 服务器放在前面,它将接收请求并将它们转发到要处理的 Verticle。

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

于 2021-04-09T06:16:05.383 回答