首页 / 软件开发 / 数据结构与算法 / “我能以后再调用你吗?”使用SCA开发异步服务
“我能以后再调用你吗?”使用SCA开发异步服务2009-12-11 infoq 胡键译这篇文章(作者是IBM的Mike Edwards)讨论了在使用SOA构建应用时所需的异步服务。异步服务的构建很复杂,但是使用服务组件架构(SCA)则构建相对直接。本文描述了使用SCA创建异步服务和异步服务客户端所涉及的步骤。 业务过程和异步服务的需要尽管我们都认为要是事情能马上搞定就好了,但是到目前为止,在现实生活中事情常常要花一段时间才会发生,涉及到一系列有顺序的步骤。设想在线订购一些书籍。先是搜索你想要的书籍,接着你可能会去检查当前的数量,指定发货日期和可供选择的交付方式。一旦订单寄出并付了款,书不会立马拿到:首先,书商会发送订单的确认,以及期望的发货日期。你也可能会得到一个某种类型的订单号,这样你就可以检查订单的状态。在随后的某个时间,书商会给你发送一个你订单的发货确认,以及一个跟踪号,你可用它来检查运货公司的运货状态。最后,如果幸运的话,你就拿到书了。很多类型的业务过程有这些特性。当我们试图构建支持这些业务过程的应用时,典型的“调用-返回”风格的服务很明显不能很好地工作。调用-返回,也称同步处理,即一个服务的客户端调用服务,然后停止工作,在客户端代码继续工作之前等待服务完成它的任务。如果客户端代码没有什么可做的,这就给运行客户端的系统增加了一个负担,因为它必须使代码保持在内存中,同时止步不前。如果系统中只有客户端代码运行,这不是个问题——但是当系统在一分钟内处理成千上万条单个客户端的请求时,麻烦很快就来了。另一个情况是客户端代码能在等待被调用服务完成的同时能干些别的事情。安排假期的客户端代码可能需要调用服务来安排航班、酒店、出租车。比起一次调用一个服务然后在继续下一个之前等待每一个的完成来说,并行处理这些请求会快得多。在这些情况下,它们被称为异步处理。你可以把这想象成客户端向一个服务发送一个请求消息,然后继续一些新工作。被调用服务开始它的工作,当工作完成了,它再给客户端发回一个响应消息。或者它可能会给客户端发回多个响应消息,正如你在订书过程中看到的,其中一个消息确认订单,另一个消息指明订单的派发。构建异步服务的工具假使存在有异步服务的需求,那么有什么工具帮助我们来构建这些服务呢——以及构建异步服务的客户端?绝大多数编程模型和框架都很好地提供了编写同步服务的客户端的工具。对于编写同步服务也是如此。同步的“调用-返回”模型是用绝大多数编程语言编写代码的标准形式。结果是,编写同步服务或同步服务客户端通常不用对标准的编程模型进行多少扩展。例如,在Java中,这通常意味着一个服务被实现为一个类中的一个方法,而这个服务的客户端就是对这个类方法的调用。编写异步服务和异步服务客户端的工具并没有得到很好的发展。Java是众多编程语言的典型,异步编程在其中成为一等公民还是最近的事情——随着在Java 5中并发类的出现。还有些异步处理工具可以通过一些协议相关的编程模型[2]来使用。举个例子,JAX-WS [5]提供了编写同步服务的异步客户端的方法,使用Web服务作为客户端和服务间的通信方法。这种情况中,假设同步服务调用的客户端代码如下: this:OrderResponse placeOrder( OrderRequest oRequest );
例 1:简单的同步placeOrder操作等价的异步服务调用如下:Future placeOrderAsync( OrderRequest oRequest,
AsyncHandler responseHandler );
例 2:placeOrder请求的异步形式对调用的异步响应经由声明如下的异步响应处理程序发回给客户端:class OrderResponseHandler implements AsyncHandler {
public void handleResponse( Response theResponse ){
OrderResponse orderResponse = theResponse.get();
}
}
例 3:在placeOrder完成之后处理程序方法会被调用JAX_WS不支持编写异步服务。它也只支持一个特定请求刚好一个响应的情况。一个支持异步风格客户端和异步服务的Java框架是JMS API [6]。当客户端和服务之间使用支持JMS的消息系统进行通信时就可以使用JMS API。在Java EE框架中,可以通过消息驱动Bean[7]使用JMS。尽管JMS方法支持一些异步服务,但是JMS将客户端和服务代码束缚到了某些消息基础设施的使用之上。最后,支持所能想到的异步业务过程的一个整体语言都已以被开发出来了。这就是业务过程执行语言(简称BPEL)[8]。BPEL特别擅长协调一组服务,包括同步的和异步的,但是它可能不擅长编写涉及大量数据操纵的服务或客户端。SCA和异步服务SCA对创建异步服务和异步服务客户端提供了直接支持。SCA支持具有简单的交互模式(每个请求消息一个响应消息)的异步服务,也支持具有更复杂的交互模式(每个请求0个、1个或多个响应消息)的异步服务——记住,我们的“简单”订书过程为每条订书请求产生两条响应消息。SCA支持使用一个范围广泛的编程语言中的任何一种编写的异步服务,例如包括Java和BPEL。此外,SCA还能够选择客户端和提供者间的通信方法——它可能使用消息基础设施(如JMS所使用的),但它也可能选择使用Web服务基础设施。SCA不会把客户端或服务提供者代码束缚到任何特殊的通信基础设施上。