具有异步支持的基于连接池的 Web 服务器与基于事件循环的 Web 服务器
Connection pool based web server with async support vs Event Loop based web server
我正在学习 Vertx 及其生态系统,首先我了解了事件循环,这个概念对我来说真的很好。
但是从 Servlet 3.1 开始,我们可以在基于 JAVA 的服务器中使用异步支持。
我正在使用 Spring,它是新的 class,名为 deferredresult
,它可以从 tomcat 中获取线程,将逻辑执行交给执行程序线程池中的线程使来自 tomcat 的线程可以自由处理其他请求,然后在它完成后 return 响应。
在事件循环中,所有阻塞调用都应该由 worker vertx 完成,概念是完全相同的,你给一个线程来阻塞调用,并在任务完成时提供回调事件循环执行回调和 return 响应.
这些概念看起来和我很相似。
也许我漏掉了什么,但这些概念之间有什么区别?
基于线程池的 Web 服务器使用工作线程作为用户请求的主要执行上下文。当您开发 Spring 或 JavaEE 应用程序时,您会调用大量阻塞代码(JDBC、Hibernate、JAX-RS 客户端等)。
然后添加了 servlet 3.1 async API 来解决像长轮询这样的问题(如果你所有的工作线程都在等待,你就不能再处理请求了)。
然而,基于事件循环的系统(Vert.x,Node)被构建为使用单个线程处理大量用户请求。通常您将它们与非阻塞数据库驱动程序或 Web 客户端结合使用。
这是一个 very powerful model(更少的线程迁移、热缓存等)。但是你一定不能阻塞事件循环,否则你不能再处理事件了。
在理想的世界中,您将只使用非阻塞库,但现实是许多 Java 库不是,我们不应该就这样丢弃这个遗产。作为解决方法,Vert.x 提供了一种将阻塞代码执行卸载到工作池的方法。
我希望这能澄清一点,并表明除了相似之处之外,用例是不同的。
我正在学习 Vertx 及其生态系统,首先我了解了事件循环,这个概念对我来说真的很好。
但是从 Servlet 3.1 开始,我们可以在基于 JAVA 的服务器中使用异步支持。
我正在使用 Spring,它是新的 class,名为 deferredresult
,它可以从 tomcat 中获取线程,将逻辑执行交给执行程序线程池中的线程使来自 tomcat 的线程可以自由处理其他请求,然后在它完成后 return 响应。
在事件循环中,所有阻塞调用都应该由 worker vertx 完成,概念是完全相同的,你给一个线程来阻塞调用,并在任务完成时提供回调事件循环执行回调和 return 响应.
这些概念看起来和我很相似。
也许我漏掉了什么,但这些概念之间有什么区别?
基于线程池的 Web 服务器使用工作线程作为用户请求的主要执行上下文。当您开发 Spring 或 JavaEE 应用程序时,您会调用大量阻塞代码(JDBC、Hibernate、JAX-RS 客户端等)。 然后添加了 servlet 3.1 async API 来解决像长轮询这样的问题(如果你所有的工作线程都在等待,你就不能再处理请求了)。
然而,基于事件循环的系统(Vert.x,Node)被构建为使用单个线程处理大量用户请求。通常您将它们与非阻塞数据库驱动程序或 Web 客户端结合使用。 这是一个 very powerful model(更少的线程迁移、热缓存等)。但是你一定不能阻塞事件循环,否则你不能再处理事件了。 在理想的世界中,您将只使用非阻塞库,但现实是许多 Java 库不是,我们不应该就这样丢弃这个遗产。作为解决方法,Vert.x 提供了一种将阻塞代码执行卸载到工作池的方法。
我希望这能澄清一点,并表明除了相似之处之外,用例是不同的。