这个假期抽了点时间,在家准备一个项目的技术方案。特地对ASP.NET MVC框架下开发异步模式(ASync)应用做了一番研究。
这个项目的目标是开发出一个WEB应用,该应用的并发业务请求量非常大,而业务的处理,则大部分由第三方系统提供的Web Service完成。
为了提高系统的吞吐量,采用异步式模型来调用第三方的Web Service是最好的选择。在此,先简单介绍一下异步式模型的好处。
IIS内有一个工作线程池,处理每个HTTP请求时,都会由工作线程池的一个线程进行处理,当该线程在执行对外部资源的请求时,比如说,数据库请求、Web Service,该线程就会堵塞,等到外部资源请求返回时,才会继续执行。由于工作线程的数量有限,当HTTP请求的进入数目超过工作线程可以处理的速度时,IIS就会将请求放进请求队列里,当队列满了以后,新的请求就会出现503错误。
如果采用异步式模型,则外部资源的请求可以交由IIS外部的另一个线程池的线程负责,IIS的工作线程不会堵塞,而是立即返回,继续处理下一个请求,当外部线程将外部资源返回的结果获得后,再唤醒IIS工作线程池的空闲线程,完成后续的代码处理,并将结果返回给请求发出者。
由此可见,采用异步式模型最大的好处是,将耗时的外部资源请求操作与IIS工作线程的工作并行处理了,提升了IIS工作线程的处理效率,缩短了请求的等待时间,从而提升了IIS的吞吐量。
要实现WEB应用的异步式处理,也很简单。大致可以分以下几步:
一、将一个同步调用的方法转换为支持异步式调用
平时大家开发的类的方法,都是支持同步式调用的,如果这个方法要用在异步式调用中,则要做一些改造。
根据MSDN的介绍,实现一个异步式调用的方法有三种设计模式:
异步编程模型(Asynchronous Program Model),简称APM。
基于事件的异步模型(Event-based Asynchronous Pattern),简称EAP。
基于任务的异步模型(Task-based Asnychronous Pattern),简称TAP。
其中,以APM实现最简单。
首先,定义一个delegate,该delegate的签名跟同步方法一样。
.NET对delegate有一个内置的异步式调用支持,任何delegate都缺省有BeginInvoke和EndInvoke两个调用方法。请看以下举例。
一个同步方法的定义如下: