很多 SOA 实现都依靠于用 xml 定义的消息格式。结果,消息模式可能变得非常复杂、不兼容、难以维护,甚至造成严重的可伸缩性和性能问题。在本文中,Frank Cohen 将介绍如何通过在 SOA 中间层使用 XML、XQuery 和本机 XML 数据库技术来提高 SOA 性能的战略和技术。 很多软件架构师在面向服务体系结构(SOA)设计中使用 XML,虽然没有一种 SOA 标准要求在 SOA 中使用 XML 或者提供相关指南。因此,软件开发社区做了很多实验和调查来发现定义服务端点和消息定义(模式)的最佳方式。这些方法大多数都会带来了糟糕的性能和可伸缩性。比如,最早提出用 SOA 实现 ebXML 的 General Motors Corp.,其最初的设计使用的是 Universal Business Language (UBL),建立的 XML 消息有 150,000 字节到 10 兆字节甚至更大。2004 年,我的性能测试公司 PushToTest 认为当时的 java™ 应用程序服务器没有提供足够的吞吐量,在 GM Web Services Performance Benchmark 研究中提出了可伸缩性和性能问题。当时基于 XML 的 Web 服务技术还非常新,我认为新一代应用程序服务器技术会解决性能问题。但大部分问题仍然存在。Web 服务吞吐量问题和复杂的 XML2005 年,PushToTest 完成了一项新的 SOA 性能研究(请参阅参考资料)表明,在处理复杂的 XML 消息时,使用当前 Java 应用程序服务器构建的应用程序其性能很差,不足以投入生产。是发现的问题和以前研究中的问题相同:
性能问题在 SOA 设计中会引起连锁反应。SOA 是一种组件软件重用技术。一个服务通常调用其他服务来确定对消费者请求的响应,从而形成一个调用链。图 3. 消费者不仅仅是一个服务的性能问题,每个服务在序列化、反序列化请求和响应的时候都会增加同样的开销。随着服务调用层次的增加,性能问题也成倍增加。加快 SOA 失去的机会除了 SOAP 绑定代理速度慢的问题,SOA 设计还经常忽略或者忽视另外两个问题。首先,SOA 设计经常忽视了用中间层服务缓冲来提高 SOA 性能的可能性。比如多数 SOA 设计中的 XML 模式都定义了了响应的 time-to-live 值。在这种情况下,缓冲服务响应并在服务再次收到同样的请求时重新使用缓冲的响应是一种提高 SOA 服务性能的合理而适当的方法。其次,在 SOA 性能测试中,我尝试了各种不同的 XML 消息解析方法,其中包括 Streaming API for XML (StAX)、XML 绑定编译器、Java Architecture for XML Binding (JAXB) 和 Document Object Model (DOM) 技术。一些技术的性能要优于另一些。比如,很多 StAX 解析器能够提供比 DOM 解析器快 2 到 10 倍的性能。我怀疑假如使用其他东西而不是 Java 对象来提供 SOAP 绑定是否能够改进性能。比如,假如收到的 SOAP 请求在本机 XML 环境中处理,那么基于 Java 的 SOAP 绑定就不再是必需的了,同时还可以避免因为序列化成 Java 对象而导致的性能降低。此外,一些本机 XML 环境使用 Java Virtual Machine 环境,但会避免构造 Java 对象。比如,Raining Data 的 TigerLogic XDMS 和 Kawa/Qexo 通过将 XQuery 查询直接转换成 Java 字节码来实现 XML 处理代码。这样做是因为与使用 Java 对象相比,使用 XQuery 字节码实现的 XML 处理代码的吞吐量更大,代码更短。FastSOA 解决方案FastSOA 是解决这些问题的一种体系结构和软件编码实践:
FastSOA 通过减少 Java 对象的需要,更多使用本机 XML 环境提供 SOAP 绑定来解决 SOAP 绑定(代理)性能问题。
FastSOA 引入了中间层服务缓冲来加快 SOA 服务。
FastSOA 使用本机 XML 持久性来避免 XML 到关系数据库的转换造成的性能问题。
下图显示了 FastSOA 体系结构。图 4. FastSOA 体系结构FastSOA 体系结构与现有的基于 Web 的基础结构结合在一起,作为中间层缓冲部署来接收服务消费者的请求。比如,一个消费者向服务发出 SOAP 请求。中间层缓冲提供 SOAP 绑定(代理)。绑定调用 XQuery 在 XQuery 引擎处理 XML 请求文档。XQuery 检查缓冲,查看以前是否收到该请求;在这种情况下,FastSOA 服务可以从缓冲中返回响应,不需要逆流而上再请求服务。该过程通过缓冲加快 SOA 执行从而实现了 SOA 提速。FastSOA 方法的优点包括: