从服务使用者的角度,本章借鉴组件的度量方式(Fellner,K.J.,2000;Herzum,P.,2000)将服务粒度的度量方法分为三类:数据量粒度(Data Granularity)、功能粒度(Functionality Granularity)、业务粒度(Business Value Granularity),它们分别通过服务调用过程所交换的数据量、服务所具备的功能数量以及服务对于服务请求者的适用程度来衡量服务的粒度,如图5-4所示。其中,按照服务数据交换的方向,即数据是发送向服务还是由服务所返回,可以将数据量粒度进一步细分为输入数据量粒度(Input Data Granularity)和输出数据量粒度(Output Data Granularity)。服务所提供的功能有些是固定返回相同的结果,而有些则是根据接收参数的不同而返回不同的结果,据此,功能粒度又可进一步细分为默认功能粒度(Default Functionality Granularity)和参数功能粒度(Parameterised Functionality Granularity)两类。
1.输入数据量粒度
输入数据量粒度表示在服务使用过程中,服务调用者向服务输入了多少数据量。粗粒度的服务需要多个对象作为参数;而细粒度的服务不需要或者很少对象参数。除了参数的个数,参数的数据类型对于此类粒度也起决定性作用。例如,空间对象类型通常比字符型的参数数据量大,因此,当作为输入参数时,相应的服务粒度前者要大于后者。一般而言,由其他多个数据元素组合而成的数据元素粒度较大,另外,由于对象类型的参数具备多个属性,每个属性是一个基本的数据类型,因此对象类型的参数粒度也较大。
图5-4 服务粒度的分类
【例5.1】考虑到输入数据粒度,服务Validate Contract(Contract c)比服务ValidateAddress(Address a)的粒度要大。
通常,构建输入数据粒度较大的服务更具优势:首先,单次传输的数据量较大,传输交互的次数相应地变少。特别对于Web服务,异步消息的传输需要大量的并发操作和XML形式的变换,从而导致服务间的频繁交互。另外,如果一个服务在同一变换中需要更新多个数据元素,最好的解决方案是输入全部的数据元素,以避免数据的多源和版本问题。特殊地,如果服务的输入数据是在调用另外服务的过程中得到的话,在输入之前,需要进行数据的有效性验证。
2.输出数据量粒度
服务的输出数据量粒度是指服务调用以后有多少数据量最终返回给服务消费者。粗粒度的服务返回一个或多个对象,细粒度的有很少个或者无返回值。上述在输入数据量粒度部分中有关数据元素对于服务粒度的影响同样适用于输出数据量粒度。
【例5.2】考虑到输出数据量粒度,服务Client SearchCustomer()比服务Date SearchBirthDate()粒度要大。
与输入数据量粒度相同,构建较大输出数据量粒度的服务可以减少服务间交互、调用的次数。其次,大粒度的服务不会妨碍服务的重用性,服务消费者可以将多余的部分丢弃不用。虽然这样做可能会浪费一部分网络带宽资源,但不会造成其他严重的问题,特别是较大型的Web服务应用。(www.xing528.com)
有些服务的输出值是一串数据元素,这些服务的输出数据量粒度具有动态和不确定性。这种情况既增加了输入数据的数量,也降低了服务本身的易理解性。相应地,这种服务被称为多粒度服务,它可以变换成多个具备固定输出数据量粒度的服务,这些服务共同组成原始的服务。
3.默认功能粒度
服务的默认功能粒度指服务在任何情况下默认提供的功能数量,即不能通过调整参数设置而变化的功能数量。一个执行CRUDS(create,read,update,delete,search)功能的服务比同时执行逻辑运算的服务粒度要小。典型地,聚合了其他服务功能的服务比它的组成部分粒度要大。例如执行整个业务流程的服务比单一执行业务流程中的某个行为的服务粒度要大。
【例5.3】顾及默认功能性服务粒度,服务HandleClaimProcess()比服务IdentifyCustomer()粒度要大。
4.参数功能粒度
服务的参数功能粒度指服务根据用户的参数输入,相应提供服务的数量。粒度较大(小)的服务提供许多(很少)的设置,方便用户通过输入参数等方式配置所需要的功能。参数的数量以及它们的数据类型都可以定义服务的粒度大小。例如,参数可以是Boolean类型,表示一个二进制的选择;也可以是一个结构化的文件。其他条件都相同的情况下,前者会产生一个较小参数功能粒度的服务。
【例5.4】考虑到参数功能粒度,服务HandleProcess(Process aProcess)比服务WriteCredit(Boolean Validate)粒度要大。
按照参数功能粒度,大粒度服务更为通用化,因此可以用于多种场合。事实上,任何不同参数的组合都能引起服务不同的行为,因此,它具有更好的重用性。如果沿着这个推理继续走同极致(Schmelzer,2000),我们只需要构建服务DoSomething()就可完成所有的用户需求。不过这种需求尽管具有很明显的优点,最主要的缺点存在于服务的执行过程。服务的使用变得更为复杂,他们需要了解服务的参数运行搭配机制。
小粒度服务的重用性相对较差,服务消费者可以通过参数的设置来控制大粒度服务的重用性。例如,对于服务HandleProcess(Process aProcess),如果以一个复杂的过程描述作为服务的输入,该服务具有很高的重用价值,相反如果输入仅是一个简单的仅包含有限行为的过程的话,该服务的重用价值就大打折扣。粗粒度的服务通常较少发生变化,因为这些变化可以通过配置进行调整。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。