1

我正在学习 Vertx 和它的生态系统,首先我了解了事件循环,这个概念对我来说真的很好。

但是从 Servlet 3.1 开始,我们可以在基于 JAVA 的服务器中使用异步支持。

我正在使用 Spring,它是一个名为的新类deferredresult,它可以从 tomcat 获取线程,从执行器线程池执行逻辑给线程,使 tomcat 中的线程可以自由地处理另一个请求,然后在它完成时返回响应。

在事件循环中,所有的阻塞调用都应该由worker vertx完成,概念是完全一样的,你给阻塞调用一个线程,并在任务完成时提供回调事件循环执行回调并返回响应。

这些概念看起来和我很相似。

也许我错过了一些东西,但这些概念之间有什么区别?

4

1 回答 1

5

基于线程池的 Web 服务器使用工作线程作为用户请求的主要执行上下文。当您开发 Spring 或 JavaEE 应用程序时,您会调用大量阻塞代码(JDBC、Hibernate、JAX-RS 客户端等)。然后添加了 servlet 3.1 异步 API 来解决长轮询等问题(如果所有工作线程都在等待,则无法再处理请求)。

然而,基于事件循环的系统(Vert.x、Node)是为使用单个线程处理大量用户请求而构建的。通常您将它们与非阻塞数据库驱动程序或 Web 客户端结合使用。这是一个非常强大的模型(更少的线程迁移、热缓存等)。但是你不能阻塞事件循环,否则你不能再处理事件了。在理想的世界中,您将只使用非阻塞库,但现实情况是许多 Java 库不是,我们不应该把这些遗留物扔掉。作为一种解决方法,Vert.x 提供了一种将阻塞代码执行卸载到工作池的方法。

我希望这能澄清一点,并表明除了相似之处之外,用例是不同的。

于 2018-03-28T13:30:14.237 回答