信息化 频道

让企业SOA项目更可控之必备十大戒条

  4.不要自己做琐事

  通用功能

  业务服务应该只包含特定于该服务的那些功能逻辑。它应该把其他功能都委托出去。那样的话,服务自身就可以尽可能简单。这使得设计、测试以及替换服务,如有必要的话,更容易。这是个基本的数学知识:新软件模块需要匹配的因素越多,那么同价位下的成品软件(COTS)的共性越少,而且若恰好有个方案可用时它也会更贵。如果可以将这些非特定功能委托给标准服务,那么就可以降低需要匹配的因素个数。

  服务可以代劳的首要任务是琐事:都是些“家务事”而非真正业务相关的功能。这些琐事天生就是普遍的,换句话说完成这些琐事的方式并不是为支持业务上下文的服务量身定制的。

  通用用户接口

  当你得知信息系统最不应该做的一大琐事就是管理用户体验时你可能会觉得惊讶。这是一个通用的功能,应该尽可能的采用标准工具来处理。用户体验包括用户可以选择要执行工作项的工作列表,工作项执行的工具——比如通过启动一个用户界面(如果有的话)来关闭已完成的工作项。它包含了用户有可能执行的交易甄选,输入信息屏幕的表示——一般是从XSD生成——以及使用和交易相对应的标准验证服务进行验证。它包括了保持当前用户上下文环境,这样他就无需再次输入当前的客户、产品、项目、流程实例或者其他任何东西,而是可以使用这些默认值或者在必要时候重写它们。它包括了和当前用户上下文环境相关的所有文档的介绍。它包含了用户可能需要作出响应的提示对话框。

  所有这些东西都可以使用无需包含任何业务知识的工具实现。总的来说,给用户提供一个统一、包含所有东西的环境远比为某个特定行为而优化的用户界面要好。如果有业务案例违背了这一原则,请至少记住这点:在稳定用户界之前,不要去优化它。

  典型通用功能

  其他的琐事还包括,但并不仅限于以下几个方面:

  安全:建立服务请求者身份和访问权限。

  通知:确认某一业务事件应通知哪些人。这包括了维护基于此的事件订阅。

  输出管理:在线下进行信息通信,而不是作为一种服务响应。典型例子就是当客户请求必须被正式确认时,比如使用电子邮件来确认你刚刚通过浏览器所做的网上采购。对那些主动提供的消息也是需要的,比如每月的账单。输出管理必须决定通过哪条渠道去发送信息,以及使用哪个地址来发送。它应该把消息转换成接收方能够接收的格式,发送消息,并把消息添加到归档文档。输出管理包括维护那些被用来将数据转换成用户可理解消息的模板,以及潜在接收者的地址和渠道偏好。

  数据转换:把数据从一种格式转换为另一个,把独立的各个服务打包为一个服务——用麦当劳的说法,开心乐园餐——以及分解拆包,将服务请求拆分成适用于不同人群的各个独立请求,汇集各个回应,排队及出列,或协议转换。

  流程编排:编排某一流程,以确保按适当顺序且仅相关时来执行那些组成流程的服务,确保快要逾期时发送告警信息,以及确保因辅助信息或者逾期打断从而引起的新流程分支被启用。

  归档管理:维护及访问相关的归档信息。这些可能是虚拟的档案,从某种意义上是展现给用户的信息,当他需要某个档案时可以使用查询来检索。对那些从数据库中抽取的内容,这被认为是正常的,但是没有特殊理由不对文档使用相同的方法。在某些情况下应使用设备来特别增加指派文档至档案中。

  记录管理:维护那些不允许被更改的信息。

  至下而上叙述

  这些实现琐事的服务不能形成业务服务层次的部分。不能使用自上而下的方式去设计它们,因为这些服务都没有所谓的“上”。对这样的服务,使用旨在实现最大程度重用的自下而上的方法会更适合。这使得从这个阶段起就能够实现服务的优胜劣汰。

  采用数据库化的方法,很少能够实际把次等通用功能用更好的替换,因为这要求修改所有使用该方法的应用。使用SOA则不同,这种替换很简单,前提是已经应用了“不去了解你不需要了解的事情”这条规则,包括其推论:服务请求不应该包含超过指定该请求必要信息之外的其他信息,而且服务本身应该在需要时主动要求更多信息。如授权服务,该服务由某应用调用,旨在决定是否允许某特定用户在某客户数据上执行某项功能——比如说:“我们的雇员Donald Jones是否被授权可以访问Acme Widgets company公司相关的财务数据?”。服务的简单版本可能具备处理某些特定情况的能力,在此特定情形下可以通过使用雇员功能对应表来回答这些问题。稍微复杂一点的版本可能会识别出Donald Jones属于某个或多个组的成员,除了个人权限外还拥有该组的权限。再更近一步,授权服务可能会使用用户证书去区别雇员和客户,并允许客户只能够访问他们自己的数据。一个完善的版本可能会使用标准化的服务去调用业务流程管理系统或者项目管理系统,询问Donald Jones是否已经被赋予了任何我们和Acme Widgets交易相关的职责。更好的做法是,授权服务会记录请求和应答的日志,而简单的版本不会这样做。组织可以从一个服务的版本切换到另一个而无需对调用服务的应用做任何改变。

  也有可能设计出根据操作必需的条件自动配置自己的通用服务。例如,授权服务可以检查是否有服务可以告知它员工对某些特定客户有职责,并在该服务不可用的情况下决定只使用个人还是群组的访问权限。用这种方式,服务可以在很多组织之间复用。

0
相关文章