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方法

 

Java代码   收藏代码
  1. public void resume()  
  2.  {  
  3.      ...  
  4.          SelectSet selectSet = _endPoint.getSelectSet();  
  5.            
  6.          synchronized (selectSet)  
  7.          {  
  8.              this.cancel();     
  9.          }  
  10.   
  11.          _endPoint.scheduleIdle();  // TODO maybe not needed?  
  12.          selectSet.addChange(this);  
  13.          selectSet.wakeup();  
  14.      }  
  15.  }  

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

 

Java代码   收藏代码
  1. public void wakeup()  
  2. {  
  3.     Selector selector = _selector;  
  4.     if (selector!=null)  
  5.         selector.wakeup();  
  6. }  

基于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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty和Jetty都是Java中常用的网络通信库,它们的实现原理如下: 1. Netty Netty是一个基于事件驱动的异步网络通信库,它采用NIO(非阻塞IO)模型实现高性能的网络通信。Netty的主要特点包括: - 基于NIO模型,实现高性能的网络通信; - 采用事件驱动的方式,支持异步IO操作; - 提供了丰富的编解码器和处理器,方便用户进行网络通信协议的实现; - 支持多种网络协议,如TCP、UDP、HTTP、WebSocket等。 Netty的实现原理主要包括以下几个方面: - Reactor模式:Netty采用Reactor模式作为底层通信框架,通过Selector轮询IO事件,然后分发给对应的Handler进行处理; - Channel和EventLoop:Netty中的Channel表示一个网络连接,EventLoop表示一个事件循环,一个EventLoop可以对应多个Channel,通过事件驱动的方式进行异步IO操作; - Pipeline机制:Netty中的Pipeline是一种处理器链,每个Channel都有一个对应的Pipeline,通过添加不同的处理器,可以实现对网络通信数据的编解码、处理等操作; - ByteBuf:Netty中的ByteBuf是一种高效的字节缓冲区,支持读写操作,可以减少内存拷贝和提高IO效率。 2. Jetty Jetty是一个基于Servlet容器的Web服务器和Servlet容器,它采用线程池和NIO模型实现高性能的Web服务。Jetty的主要特点包括: - 基于Servlet容器,支持常用的Web应用开发技术; - 支持异步Servlet和WebSocket等技术,提高Web应用的性能和交互效果; - 支持HTTP/2和WebSocket协议,提升Web应用的传输效率; - 支持多种Web容器集群部署方式,提高Web应用的可伸缩性。 Jetty实现原理主要包括以下几个方面: - Servlet容器:Jetty采用Servlet容器作为底层通信框架,通过处理HTTP请求和响应来实现Web服务; - 线程池和NIO模型:Jetty采用线程池和NIO模型实现高性能的Web服务,通过异步IO操作来提高Web应用的吞吐量; - WebSocket和HTTP/2支持:Jetty支持WebSocket和HTTP/2协议,提高Web应用的传输效率和交互效果; - Web容器集群:Jetty支持多种Web容器集群部署方式,提高Web应用的可伸缩性。 总的来说,Netty和Jetty都是高性能的网络通信库,它们实现原理的核心都是采用了NIO模型和事件驱动的方式来实现异步IO操作。Netty主要用于实现网络通信协议,如TCP、UDP、HTTP、WebSocket等,而Jetty主要用于实现Web服务器和Servlet容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值