处理服务请求的方法和装置技术领域
本发明涉及网络计算领域,特别涉及一种异步处理API服务请求的方法和装
置。
背景技术
Continuation是一种可以使HTTP请求可以被暂时挂起,并且当挂起超时
或非同步的事件发生时,被挂起的HTTP请求可以被重新恢复的机制。这个机
制的实现主要在SelectChannelConnector类中。SelectChannelConnector允
许维持每个连接开放而不用消耗一个线程。当连接挂起时,Connector将请求
维持在未决Continuations队列里,用来服务请求的线程返回给TheadPool,
这样,该线程又可以服务于其他请求。暂停的请求停留在未决Continuations
队列里直到指定的过期时间,或者在它的Continuation上调用resume方法。
Continuation.suspend会抛出一个特殊的运行时异常:RetryRequest,这个异
常将传播servlet以外,然后通过过滤器传回再由SelectChannelConnector捕
获,将请求放入处于等待状态的Continuation队列中,此时HTTP连接并不关
闭,而当前的程却可以被放回线程池,供别的请求使用。Continuation机制实
际就是对HTTP协议执行NIO(非阻塞I/O)。每个环节都是异步处理,这样极大
的提高了请求的TPS(每秒能够处理的事务量)以及并发的性能。
然而,Jetty continuation需要在应用中使用应用级的线程池来完成一些
IO任务,这个在普通的web编程并不常见。在应用的第一次请求中,需要调用
AsyncContinuation.suspend,完成一个状态的转换,以及产生一个超时任务,
将超时任务派发给应用线程池完毕后,Jetty回收该请求,线程IO任务在应用
线程中完成后,然后通过AsyncContinuation.resume或者complete等方法通
知Jetty任务完成Jetty然后会再次分配一个worker线程处理该请求,如果逻
辑复杂,如并行的多次IO会分配多个worker线程。引入Jetty continuation
带来的负面作用是需要仔细的切割各类IO任务,编程模型因而会变得复杂。
发明内容
为解决上述现有技术所存在的问题,本发明提出了一种处理服务请求的方
法和装置。本发明首先提出了一种处理服务请求的方法,包括:
步骤一,在Jetty Continuation的请求处理中建立异步层次结构,包括传
输层,转换内部数据层,转换外部数据层,接出层;
步骤二,利用Continuation异步处理请求;
步骤三,在所述异步层次结构中逐级异步发送请求,并异步返回处理结果,
并通知释放请求。
步骤二包括:取当前请求的Continuation对象,设置监听器,在处理请
求后挂起并释放线程。该方法基于JSR315规范特性来处理异步请求。
所述请求的接入方式包括DHReqContinuationServletHandler和
DHReqAsynServletHandler,均抽象为AbstractDHReqServletHandler。
所述请求接入方式基于servlet3.0和Jetty8的continuation的挂起
消费策略来实现,这针对不同的servlet容器来切换不同的异步请求处理机
制。
所述步骤三进一步包括:所述接出层收到该请求后,进行服务化API调用,
将处理结果逐步返回至转换外部数据层,转换内部数据层,和传输层,通知
Continuation释放请求,返回处理数据至servlet。
该方法还包括,当某一时刻请求大量接入时,不需要等待线程释放,而是
将线程挂起,处理完毕后通知Jetty,此时Jetty再启用一个新的线程再次处
理请求。
根据本发明的另一方面,提供了一种处理服务请求的装置,包括:模型建
立模块,用于在Jetty Continuation的请求处理中建立异步层次结构,包括
传输层,转换内部数据层,转换外部数据层,接出层;Continuation模块,用
于利用Continuation异步处理请求;发送和返回模块,用于在所述异步层次
结构中逐级异步发送请求,并异步返回处理结果,并通知释放请求。
所述Continuation模块进一步包括:获取子模块,用于获取当前请求的
Continuation对象,监听子模块,用于设置监听器,挂起子模块,用于在处理
请求后挂起并释放线程。所述发送和返回模块进一步包括;调用子模块,用于
在所述接出层收到该请求后,进行服务化API调用,返回子模块,用于将处理
结果逐步返回至转换外部数据层,转换内部数据层,和传输层,释放子模块,
用于通知Continuation释放请求,返回处理数据至servlet。
相比于现有技术,本发明的技术方案层次结构简单和清晰可见,每一层对
应的代码均具有语义,易于和维护,最大程度降低了耦合。由于每层都是异步
处理,系统性能被提升,具有应对未来大并发处理的能力提高请求访问的TPS
并发。
具体实施方式
本发明提出了一种处理服务请求的方法,包括:
步骤一,在Jetty Continuation的请求处理中建立异步层次结构,包括传
输层,转换内部数据层,转换外部数据层,接出层;
步骤二,利用Continuation异步处理请求;
步骤三,在所述异步层次结构中逐级异步发送请求,并异步返回处理结果,
并通知释放请求。
步骤二包括:取当前请求的Continuation对象,设置监听器,在处理请
求后挂起并释放线程。该方法基于JSR315规范特性来处理异步请求。
所述请求的接入方式包括DHReqContinuationServletHandler和
DHReqAsynServletHandler,均抽象为AbstractDHReqServletHandler。
所述请求接入方式基于servlet3.0和Jetty8的continuation的挂起
消费策略来实现,这针对不同的servlet容器来切换不同的异步请求处理机
制。
所述步骤三进一步包括:所述接出层收到该请求后,进行服务化API调用,
将处理结果逐步返回至转换外部数据层,转换内部数据层,和传输层,通知
Continuation释放请求,返回处理数据至servlet。
该方法还包括,当某一时刻请求大量接入时,不需要等待线程释放,而是
将线程挂起,处理完毕后通知Jetty,此时Jetty再启用一个新的线程再次处
理请求。
根据本发明的另一方面,提供了一种处理服务请求的装置,包括:模型建
立模块,用于在Jetty Continuation的请求处理中建立异步层次结构,包括
传输层,转换内部数据层,转换外部数据层,接出层;Continuation模块,用
于利用Continuation异步处理请求;发送和返回模块,用于在所述异步层次
结构中逐级异步发送请求,并异步返回处理结果,并通知释放请求。
所述Continuation模块进一步包括:获取子模块,用于获取当前请求的
Continuation对象,监听子模块,用于设置监听器,挂起子模块,用于在处理
请求后挂起并释放线程。所述发送和返回模块进一步包括;调用子模块,用于
在所述接出层收到该请求后,进行服务化API调用,返回子模块,用于将处理
结果逐步返回至转换外部数据层,转换内部数据层,和传输层,释放子模块,
用于通知Continuation释放请求,返回处理数据至servlet。
相比于现有技术,本发明的技术方案层次结构简单和清晰可见,每一层对
应的代码均具有语义,易于和维护,最大程度降低了耦合。由于每层都是异步
处理,系统性能被提升,具有应对未来大并发处理的能力提高请求访问的TPS
并发。