SOA交易概念
对数据库世界陌生的东西对与SOA来说却是再自然不过了。业务交易——实现它的一般是一个流程——就是服务。为了理解SOA何以能很好支持逻辑一致性需求,理解业务交易的需要很重要。业务交易由下面元素组成:
厂商给客户提供信息,客户据此可作出采购决定。一般来说,这种信息包括出售商品和服务的属性、得到该商品的条件——包括,当然,价格——以及可用性。从法律的角度,厂商所描述的这一信息是真实的。
用户基于厂商描述的信息下采购订单。
厂商核实该采购决定依据的信息是否仍然适用,如果是,则确认该订单。如果有变化——可能由于产品或服务已终止,或产品已经涨价,也可能是货物或服务的规格已经变更——那么需要一些处理来决定到底应该如何做:是不管三七二十一继续提交订单,还是通过协商修改订单,或者干脆取消订单。
厂商和客户双方履行采购协议中各项条约。
SOA怎样维持一致性
SOA通过多种方法维护业务交易的逻辑一致性。第一,所有暗含对前一个状况改变的通信都要使用能够保证消息安全交付的协议来完成。只要厂商或用户做出某个承诺,为实现该承诺所要做的动作就应该包含这样的改变。这样的话,客户和厂商就不可能对当前业务状态持有不同的看法了。
第二,数据库的逻辑一致性和流程管理系统中处理过程的记录可以通过两阶段提交协议来维护。跨多个数据库的逻辑一致性通过一连串这样的两阶段提交维护。首先让数据库A和流程管理系统同步,然后流程管理系统再和数据库B同步,以此类推。
第三,从厂商给客户展示产品到订单下达期间,厂商面对的任何改变都可以使用乐观锁并发控制机制来处理。这种处理方式对SOA来说很自然:判断是否存在相应改动的过程可以完全自动化。因为SOA使得数据在被用来作决定的同时也可以进行访问,找不到乐观锁而需要人工介入的情况几乎鲜有发生。
最后,一笔交易的中止——比如说用户撤销了订单,原因可能是用户没有能力支付,或者用户去世了——使用SOA可以相对容易地处理。因为在交易上下文中使用或产生的记录可以被清晰地识别,所以可以确定需要哪些补偿信息用以纠正用户和厂商的不同认知。因为哪个数据库更新和该交易有直接关系是很清楚的,在数据库中的哪些变更需要使用补偿交易服务做回滚也很清楚。假设,交易中止的发生相对不那么频繁,使这些活动完全自动化通常是高投入低产出的,但是你的设计必须要考虑到这些。
请注意业务交易的范围限制在那些为了处理某个服务请求而直接完成的操作。在SOA中,编排你自己的流程并提供事件通知给他人,是一条守则。如果服务中止了,那么有必要发通知用户这一个变化。至于他们要怎么处理,则完全是他们自己的事。
也请注意,创建用户服务请求的内容,严格说起来,应该在流程处理之前进行,而不应该作为流程处理的一部分。这真的不是你该做的事:原则上,提供消息的XSD和消息验证服务给用户就够了,让他决定是从键盘录入数据还是从他自己的信息系统以某种方式直接生成数据。对消费者来说,这并不是——尚未成为——一个可行的方法,但采集数据和处理数据是两件独立的事情,并使用不同工具在各自的环境中执行这些事情,对于这一点仍然是有效的。同样是数据采集,有很多实现方式,这取决于用户的期望以及他们和你沟通的渠道,但不管怎样都应该只有一个服务去处理这事儿。
7.不要将自己禁锢于模型
数据库只是模型,SOA代表更多
领域模型是领域本身的体现,操作领域模型要比直接操作领域更简单。绝大多数的数据库都是模型。它们以这样一种方式代表一些管理的、物理的或者社会的领域:相关领域的问题都可以通过查询数据库来得到答案,而存在于领域中所需的行为可以从数据库内部得到指示。比如说,通过访问数据库查询用户的地址信息要比跟随用户到他家然后抄下他所进房子的门牌号要方便的多。而且,在数据库中对记录进行计数也要比清点一个城市有多少人或仓库里有多少产品要容易。原则上,提供对这些功能的支持足以确定数据库的数据结构。尽管这样,因为一般不太可能事先就能明确所有这些功能,所以我们使用数据建模技术对领域中感兴趣的对象进行分析,包括对象之间的关系,以及信息项(它们会告诉我们关于其自身的一些我们可能想知道的东西)。例如,若数据库和用户有关,那么每个用户通常都应该存在对应的数据库记录,包括一些数据库使用者感兴趣的与用户相关的信息。因为数据模型更多是基于功能上的考虑而不是某些特定数据库的使用,所以将数据结构建立在这种模型之上会使数据库能够更易适应各种未预见的需求。数据库在语义上被结构化了;换句话来讲,数据库是根据其表达出的意思来构造的。
对没有实现数据模型的数据结构,数据库技术就没那么方便了。它实在不能在描述、文本、图像等方面做很多贡献。相反,SOA却能够很好地处理文档、记录,就像可以很好处理那些根据数据模型构建的数据一样。SOA允许单个设计能够处理语义结构化信息和文档。尽管如此,由于数据库系统支配了我们的思维模式,所以当应用SOA时免不了很自然的会坚持其局限性。但是在SOA的世界里不存在特殊的理由要去应用这种限制,任何理由都不能够这样做。