2008年1月15日星期二

WebService_100:服务的粒度究竟多大合适?(摘录+整理)

这是一个值得深入思考的问题。我将一直关注这个问题,期待能有一个比较好的解决办法。
1. 服务的粒度(service granularity):指一个服务包含的功能大小。
2. 细粒度服务(fine-grained)的特点:


  • 业务逻辑简单。

  • 数据量小。

  • 服务交互次数多。

  • 服务之间的耦合性大。

  • 灵活性好。

3. 粗粒度服务(coarse-grained)的特点:


  • 业务逻辑复杂。

  • 数据量大。

  • 服务交互次数少。

  • 服务之间的耦合性小。

  • 灵活性差。

结论:服务粒度既不能太大也不能太小(跟没说一样?)。

服务的粒度究竟多大合适?很遗憾,目前没有成熟的标准供我们参考。但我们知道:一个设计良好的服务应该具备三大要素:重用性,灵活性,性能。我们可以用这个标准来考量服务的粒度。

1. 重用性:服务应用于不同上下文的能力。
重用性可以降低开发和维护的成本。粒度的大小直接影响到服务的可重用性。显然,细粒度的服务更容易被重用。但是如果机械地考虑重用性,将导致大量粒度很小的功能单元,这将对系统整体性能和容量带来严重的影响。想想拼图游戏就能明白这个道理:同样大小的同一张图,用1000张拼容易还是3000张容易?

2. 灵活性:因变而变的能力。
灵活性可以更快的适应业务的变化。粒度的大小直接影响到服务的灵活性。显然,细粒度的服务可以更容易地组装,灵活性更好。同样,仅仅考虑灵活性将导致大量的细粒度的服务,这也是不可取的。这里介绍一个分析方法:自上而下的逐级流程分解法。
逐级流程分解法自上而下的逐级流程分解法是将业务流程一级级分解,直到不能分解为止。其中,把业务人员能够识别出来的服务作为候选的业务服务,粒度最小的服务就从这些服务里产生。
接下来再逐一分析每个服务,看看哪些服务有额外的灵活性要求。划分方法可以参考SAP业务流程的划分方法。SAP将流程划分为核心流程(core process)和支撑流程(context process)。其中,支撑流程是指那些不可或缺的,但又不影响企业差异化的流程,如财会流程等,它们关注的是如何提高生产效率,降低生产成本。这些流程相对稳定,因此适用于粗粒度的服务。而核心流程是指代表企业竞争力的业务流程,如营销流程等。这些流程可能随时发生变化,因此它们需要细粒度地分解,以获得最大的灵活性。

3. 性能
一个服务本身的复杂度以及调用其它服务的次数,是影响性能的两个主要方面。服务颗粒度越大,意味着包含的功能越多,业务逻辑越复杂,响应越慢。而服务颗粒度越小,意味着包含的功能越简单,虽然单个服务执行效率很高,但完成一项业务所需的服务调用次数越多,远程请求/响应次数越多。因此,为了提高服务的性能,一方面需要限制服务包含的功能范围和复杂度,也就是说粒度不能太粗;另一方面需要限制服务调用的次数和复杂度,也就是说服务粒度不能太细。二者之间需要找到一个平衡点。

用迷你裙定律(mini-skirt theory)作结:
short enough to keep people interested, but long enough to cover the important part”。
a well-designed service should be fine-grained enough to be reusable, but coarse-grained enough to make business sense”。

参考文献
1. 《服务颗粒度的困扰》 作者:http://blog.sina.com.cn/s/blog_4e2131ab01000e50.html
2. 《SOA中怎样确定服务的粒度》作者:http://www.testage.net/html/34/n-141534.html

没有评论: