`

Jetty Continuation实现原理和使用场景分析

 
阅读更多

Jetty Continuation实现原理和使用场景分析

Jetty continuation是什么?简单的说,就是用一个NIO模拟http同步连接。我们都知道http请求时同步的,就是说http request发送到server之后,server分配一个单独的线程处理这个请求,请求完成之后再返回response给请求端。这个过程中server处理线程一般是不释放,即使是什么都没有干。更关键的是承载http请求的tcp socket是阻塞式的。显而易见的是如果这个请求时间较长,不但server threads被占用而无法处理新请求,仅仅是并发连接数的问题就让人头疼。

Jetty Continuation

翻译一下Jetty Continuation的官方解释:“Continuation是一种可以使HTTP请求可以被暂时挂起,并且当挂起超时或非同步的事件发生时,被挂起的HTTP请求可以被重新恢复的机制”。这个机制的实现主要在SelectChannelConnector类中。网上不少朋友都分析了这个实现,Continuation.suspend()会抛出一个特殊的运行时异常:RetryRequest。这个异常将传播到servlet以外,然后通过过滤器传回,再由SelectChannelConnector捕获,将请求放入处于等待状态的Continuation队列中,此时HTTP连接并不关闭,而当前的线程却可以被放回线程池,供别的请求使用。我想这里应该被强调的一点就是:Continuation机制实际就是对HTTP协议执行NIO。

 

简单的看一下代码,这是SelectChannelConnector$RetryContinuation类,resume方法

 

       public void resume()
        {
            ...
                SelectSet selectSet = _endPoint.getSelectSet();
                
                synchronized (selectSet)
                {
                    this.cancel();   
                }

                _endPoint.scheduleIdle();  // TODO maybe not needed?
                selectSet.addChange(this);
                selectSet.wakeup();
            }
        }

可以看到resume()方法调用了selectSet.wakeup(),而SelectSet调用了NIO selector的wakeup方法,

 

        public void wakeup()
        {
            Selector selector = _selector;
            if (selector!=null)
                selector.wakeup();
        }

基于NIO,Jetty可以在一个非阻塞的socket中处理多个HTTP请求。

 

使用场景

我们都知道Jetty适合处理HTTP长连问题,比如网上讨论的很多的webim。我们已经讨论了Jetty实际上实现了HTTP层的NIO,那么还有更多别的场景也适合用Jetty解决。举个栗子,我有个朋友搞了一个http透明代理,用于做前端负载转发和均衡。这个代理逻辑很薄,但是它后端的处理比较重,就是说尽管透明代理什么都不干,但它的socket和线程却长期得不到释放,十分“浪费”。这种场景下,用Jetty Continuation就十分合适。

 

有一个误解是,凡是服务器“推”的长连接场景,都应该使用Jetty。其实不然,我们有一个streaming API的实现,从HTTP server推送海量数据。client端在HTTP请求里携带一个数据index,服务器根据这个index把之后产生的数据不间断的推送到client端,是典型的长连接。但是这里的长连接数量很少,而且是网络传输很重的操作,这个场景下,使用几个单独的socket,而不是多个处理复用socket,就十分合适。因此我们就使用了更简单的Tomcat服务器而没有使用Jetty。

 

总结,了解Continuation的原理可以使你更好的选择方案,而不是简单的引入过多用不上的逻辑,别忘了很多情况下,简单即是优雅。

 

本文纯属原创,欢迎引用,请注明本博地址:http://maoyidao.iteye.com/

1
0
分享到:
评论

相关推荐

    jetty-continuation-8.1.8.v20121106-API文档-中文版.zip

    赠送jar包:jetty-continuation-8.1.8.v20121106.jar; 赠送原API文档:jetty-continuation-8.1.8.v20121106-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Jetty cometd(Continuation)学习笔记

    Jetty cometd(Continuation)学习笔记,自己用的,别人那down的网页

    jetty-continuation-8.1.8.v20121106-API文档-中英对照版.zip

    赠送jar包:jetty-continuation-8.1.8.v20121106.jar; 赠送原API文档:jetty-continuation-8.1.8.v20121106...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英

    jetty-continuation-7.4.2.v20110526.jar

    jetty-continuation-7.4.2.v20110526.jar jetty 服务jar包

    jetty相关的全部jar包

    jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....

    jetty,tomcat原理

    **Jetty与Tomcat原理详解** Jetty和Tomcat是两个广泛应用的Java Web服务器和Servlet容器,它们在处理HTTP请求、执行Java ...无论是Jetty还是Tomcat,掌握它们的核心原理和使用技巧都将为你的职业生涯增添亮点。

    jetty 8及依赖包

    通过研究Jetty 8的实现,你可以提升自己的技能,更好地理解和掌握Web服务器的工作原理,以及如何高效地使用NIO和Servlet技术。同时,了解Jetty的依赖结构也能帮助你更深入地了解Java生态系统中的其他关键组件。

    Jetty工作原理

    总的来说,Jetty的工作原理体现在其灵活的Handler机制、精简的生命周期管理和高效的请求处理流程上。这种设计使得Jetty能够在保持轻量级特性的同时,满足复杂Web应用的需求,并且易于扩展和集成。对于开发者而言,...

    Eclipse与jetty插件的安装和使用

    Eclipse与jetty插件的安装和使用 Eclipse是一个功能强大的集成开发环境(IDE),它提供了许多插件来扩展其功能。Jetty是一个流行的Web服务器和Servlet容器,Eclipse提供了一个jetty插件来支持Jetty服务器的集成。...

    用jetty8.0写的websocket实现的简单聊天程序

    在这个“用jetty8.0写的websocket实现的简单聊天程序”中,我们将深入探讨如何利用Jetty 8.0这个轻量级、高性能的Java Web服务器和Servlet容器来构建WebSocket应用。 Jetty是一个开源的HTTP服务器和Servlet容器,...

    jetty实现websocket功能

    Jetty是一个轻量级、高性能的Java Web服务器和Servlet容器,它也支持WebSocket协议,并且集成了一系列WebSocket的API,使得开发者可以轻松地在Java应用中实现WebSocket功能。 在Jetty中实现WebSocket功能,首先你...

    jetty-continuation-9.2.9.v20150224.jar

    java运行依赖jar包

    jetty-6.1.26.zip

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,与Tomcat相似,它为开发和...尽管现代开发可能更倾向于使用更新的版本,但对于了解Jetty的历史和原理,以及在某些场景下部署旧项目,这个版本仍有其价值。

    Jetty插件安装及使用步骤

    与Tomcat相比,Jetty具有更好的性能表现和更小的内存占用,特别是在开发过程中能够实现热部署功能,即代码修改后无需重启服务器即可生效,大大提高了开发效率。 #### 二、Jetty插件的安装步骤 ##### 2.1 打开...

    jetty内嵌实现

    在"jetty内嵌实现"的场景下,我们可以直接将Jetty集成到我们的Java应用中,避免了传统方式下需要将应用部署到独立的Web服务器(如Tomcat)的步骤。这种方式尤其适用于测试、开发环境,甚至小型生产环境,因为它简化...

    jetty源码剖析

    Jetty 源码剖析 本文将对 Jetty 的源码进行剖析,帮助读者了解 Jetty 的实现原理和阅读底层代码。...Jetty 的源码剖析可以帮助读者了解 Jetty 的实现原理和阅读底层代码,从而更好地理解和使用 Jetty。

    Jetty源码分析.pdf

    - **应用场景**:由于Jetty的轻量特性,使其非常适合于**开发测试环境**以及**小型生产环境**使用,尤其在微服务架构中表现优秀。 - **扩展性**:Jetty的设计支持灵活的扩展,用户可以根据需求添加自定义的`...

    实战 Jetty--让你快速速学会jetty

    同时,Jetty提供清晰的接口,允许开发者在原生实现不足以满足特定需求时,轻松地对其进行修改和扩展,以适应特定的应用场景。 易嵌入性是Jetty的另一大特色。由于从一开始就定位为一个优秀的组件,Jetty可以无缝...

    jetty 源码 2018 zip

    6. **Continuation**:Jetty提供了对Servlet 3.0中Continuation接口的支持,允许开发者在处理长连接和异步操作时暂停和恢复请求。 7. **WebSocket**:Jetty提供了对WebSocket协议的支持,允许创建低延迟、双向通信...

Global site tag (gtag.js) - Google Analytics