繁体   English   中英

具有异步支持的基于连接池的Web服务器与基于事件循环的Web服务器

[英]Connection pool based web server with async support vs Event Loop based web server

我正在学习Vertx及其生态系统,首先我学习了事件循环,这个概念对我来说真的很不错。

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

我正在使用Spring,它是一个名为deferredresult的新类,该类可以从雄猫中获取线程,将逻辑执行到执行者线程池中,从而使雄猫中的线程可以自由处理其他请求,然后在完成响应后返回。

在事件循环中,所有阻塞调用均应由工作程序vertx完成,其概念是绝对相同的,您为阻塞调用提供了一个线程,并在任务完成后提供回调。事件循环执行回调并返回响应。

这些概念看起来与我非常相似。

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

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

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

我希望这可以澄清一点,并表明除了相似之处之外,用例也有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM