本文介绍了可用于 WebSphere ESB 中介流的聚合设计模式,以及在开发和部署聚合解决方案需要考虑的性能因素。
简介
聚合是一个重要的企业服务总线 (ESB) 模式。它可将单个入站请求映射到多个出站服务调用中。但在使用聚合设计模式与 IBM® WebSphere® ESB 和 IBM Integration Developer 开发中介时,需要考虑多个性能因素。本文介绍了这些性能因素,目的是让您创建高效且有效的聚合解决方案。
中介原语(mediation primitives)
本节介绍聚合设计模式开发中使用的核心中介原语组件。
Fan Out 中介原语
Fan Out 中介原语在聚合块的开始部分使用。目前支持两种模式:
- 一次模式(Once mode):提供了实现中介流分支的功能
- 迭代模式(Iterate mode):提供了对服务消息对象 (SMO) 内的重复结构进行迭代处理的功能
您应该为下面这种聚合设计模式使用一次模式来实现中介流分支:例如入站消息中包含的结构需要被转发给两个服务。而对于下面的聚合设计模式则应使用迭代模式:根据 SMO 内重复的结构,需要多次调用某个服务。
图 1. Fan Out 中介原语

原语的默认配置是一次模式。开发一个使用迭代模式的聚合模式时,应选择 For each element in XPath expression(XPath 表达式中的每个元素),并指定 SMO 内重复结构的位置。以下 XPath 定义了 SMO 内 Fan Out 上下文的位置:
/context/primitiveContext/FanOutContext
在迭代模式中使用 Fan Out 上下文存储目前出现的重复结构及其在 SMO 中的索引。
Fan In 中介原语
Fan In 中介原语在聚合块的结尾部分使用,并且要与相应的 Fan Out 原语配对使用。Fan In 支持三类决策点,这些决策点控制何时触发 Fan In 原语中的输出末端。满足指定决策点的要求时,则将已接收的最新消息传播到输出末端。下面是三类决策点:
- 简单计数:定义在触发输出末端之前,在输入末端处所接收的消息数目。
- XPath 决策:XPath 表达式等于 true 时触发输出末端。
- 迭代:在输入末端接收到相应 Fan Out 中介原语生成的所有消息之前,不会触发输出末端。
在聚合解决方案中可能会多次满足 XPath 决策和简单计数决策点的要求,导致输出末端被触发多次。而迭代决策点会导致输出末端仅被触发一次。
图 2. Fan In 中介原语

Service Invoke 中介原语
在 Fan Out 和 Fan In 中介原语之间调用所需的服务时,必须使用 Service Invoke 中介原语。在 WebSphere ESB V7.5 和 IBM Integration Developer V7.5 中还引入了其他的功能。在 IBM Integration Developer 中将 Service Invoke 中介原语添加到画布时,可选择全新的 Message Enrichment Mode(消息增强模式),如下图所示:
图 3. Service Invoke 中介原语 -- 选择 Message Enrichment Mode

选中 Message Enrichment Mode 后,在 IBM Integration Developer 内 Service Invoke 中介原语可使用下面所示的其他属性:
图 4. Service Invoke 中介原语 -- Message Enrichment Mode 属性

为 Input 参数定义了一个 XPath 语句,目的是标识输入 SMO 内结构的位置,调用已定义的服务时要使用该结构。为 Output 参数定义了第二个 XPath 语句,标识输出 SMO 内结构的位置,存储响应时要使用该结构。只有给定服务的请求和响应所需的结构在入站和出战消息中可用并且可通过单个 XPath 语句寻址时,才能应用该功能。
设计模式
该场景介绍了与 Fan Out 中介原语支持的两种操作模式相关的两种设计模式。
- 分支设计模式
- 迭代设计模式
分支设计模式
本节介绍了新的 Service Invoke 中介原语消息增强模式的差别和优势。
下面的分支聚合设计模式示例描述了一个银行场景,其中要为单个入站请求调用两个服务。入站请求中包含了适用于给定帐户的信息,并且在请求进入聚合块之前,Message Element Setter 中介原语将 RequestID 字段存储在 SMO 临时上下文中。Fan Out 中介原语配置为 “一次模式” 并且中介流被分为两个分支:第一个分支调用某个服务来检索帐户信息的摘要,第二个分支调用某个服务来检索该帐户的交易历史信息。
调用每个服务之前,BOMapper 中介原语将消息转换为正确的格式,并且就在每个 Service Invoke 中介原语后面的 BOMapper 中介原语会将给定的响应存储在共享的 SMO 上下文中。在输入末端上接收到两个响应时,会触发 Fan In 中介原语的输出末端,并且最终的 BOMapper 中介原语会聚合共享上下文和临时上下文内存储的信息,创建对初始请求的响应:
图 5. 分支聚合设计模式

Service Invoke 消息增强模式
借助 WebSphere ESB V7.5 和 IBM Integration Developer V7.5 中的新功能可以简化分支设计模式。在分支聚合设计模式中使用全新的 Service Invoke 功能后,就无需在 Service Invoke 中介原语的任一侧使用 BOMapper 中介原语了,如下所示:
图 6. 分支聚合设计模式 -- Service Invoke 消息增强模式

在 Service Invoke 中介原语中集成此功能可稍微提高运行时性能,因为此时没有了额外 BOMapper 中介原语的开销。
迭代设计模式
下面的迭代聚合设计模式示例描述了一个银行场景,其中要为单个入站请求多次调用某个服务。入站请求包含了一个重复结构,每次出现的该结构中都包含了适用于某个客户的特定帐户的信息,并且在请求进入聚合块之前,Message Element Setter 中介原语将 RequestID 字段存储在 SMO 临时上下文中。Fan Out 中介原语配置为 “迭代模式”,因此为入站请求消息中出现的每个 AccountInfo 元素都生成一个消息。每次出现该元素时都会调用一个服务,以检索帐户的摘要信息。
调用服务之前,BOMapper 中介原语将消息体中该元素的多次出现替换为当前迭代的单次出现并存储在 SMO 的 FanOutContext 中。就在每个 Service Invoke 中介原语后面的 Message Element Setter 中介原语会将每个响应中的信息追加到在 SMO 的共享上下文中定义的一个结构数组中。Fan Out 中介原语对出现的所有重复结构完成迭代处理,并且 Fan In 中介原语在输入末端上接收到所有相应的消息后,才会触发 Fan In 中介原语的输出末端。最终的 BOMapper 中介原语会聚合共享上下文和临时上下文内存储的信息,创建对初始请求的响应:
图 7. 迭代聚合设计模式

性能注意事项
本节介绍在创建聚合解决方案时需要了解的性能注意事项。
XSL 转换与 BOMapper 中介原语
聚合模式通常需要根据单个输入请求来构建多个请求,并将多个响应聚合到单个响应中。在上面的示例中,使用 BOMapper 中介原语执行在中介流中的转换工作。如果 BOMapper 中介原语支持的功能完全能够执行数据转换工作,那么使用 BOMapper 中介原语而不是 XSL Transformation (XSLT) 中介原语就能提高运行时性能,这种性能的提高与所处理消息的大小成正比。XSLT 中介原语提供了 BOMapper 中介原语所不支持的其他功能,所以在有些情况下可能使用 BOMapper 并不合适。
下图展示了图 5 中所示的分支聚合设计模式场景的三种变体的运行时性能:
- Branch-XSLT:使用 XSLT 中介原语执行所有转换工作
- Branch-BOMapper:使用 BOMapper 中介原语执行所有转换工作
- Branch-Enrichment:使用 Service Invoke 中介原语的全新消息增强模式,并使用 BOMapper 中介原语进行最终的聚合工作(如上面图 6 所示)
图 8. 分支聚合设计模式 -- 运行时性能

结果表明在可行的情况下,在聚合解决方案中使用 BOMapper 中介原语而不是 XSLT 中介原语可实现显著的性能提高。结果还表明,使用 WebSphere ESB V7.5 和 IBM Integration Developer V7.5 中 Service Invoke 中介原语的全新消息增强模式功能还能再将运行时性能提高一些。
迭代设计模式 -- 批处理考虑事项
使用迭代设计模式时,要考虑到处理大批量请求可能对同一服务器上运行的其他应用程序造成的影响。处理包含大量重复元素的请求(如销售订单)会使用大量的系统内存,并且在处理完成之前会一直使用这些内存。根据聚合内所调用服务的响应时间,块处理可能会长时间占用各种系统资源。如果处理批量请求的同一服务器上还托管了其他应用程序并且这些应用程序需要对请求进行快速响应,那么在处理批量请求的同时可能出现服务性能下降情况。为了避免此问题,可在单独的服务器上或者在系统使用率较低的时候再处理大批量的请求。
由于上面解释的原因,最大限度减少在处理大批量请求消息时所使用的内存量非常重要。使用批量处理模式时,在聚合块内很少需要使用原始请求消息体,因为 Fan Out 中介原语在 SMO 的 Fan Out 上下文中存储当前出现的重复元素。在聚合块的末尾,响应数据保存在共享上下文中并用于构建新的响应消息体。如果请求很大,通过使用 Message Element Setter 中介原语来删除就在 Fan Out 中介原语后面的消息体,或者使用 BOMapper 中介原语并且不传播 SMO 的主体,就可以显著减少内存的使用量和处理时间。
图 9. BOMapper 中介原语 -- 不传播 /body

其他内存考虑事项
聚合块完成后,将已经存储在共享上下文中的多个响应组合到一个新的响应消息体中,这个过程是在 Fan In 中介原语后面立即执行的。此时,共享上下文中的内容通常不再需要了,如果在剩下的流程中不再传播共享上下文,那么也会提高性能。如果不再需要该上下文中的任何字段了,可让上下文处于非映射状态。否则可扩展上下文元素,并且仅映射剩余中介流中所需的那些元素。
图 10. BOMapper 中介原语 -- 不传播 /context

结束语
聚合是一个重要且强大的 ESB 模式,但是在开发和部署可使用聚合的 WebSphere ESB 中介流之前,需要了解并评估多个性能考虑事项,这包括:
- BOMapper 和 XSLT 中介原语的运行时性能
- 大批量的请求处理对同一位置其他服务的影响
- 通过聚合块和中介流进行的消息数据传播
参考资料
学习
- WebSphere ESB 资源
- WebSphere ESB 信息中心
一个包含所有 WebSphere ESB 文档的 Web 门户,包括关于安装、配置和使用 WebSphere ESB 的概念、任务和参考信息。 - WebSphere ESB 开发人员资源页面
帮助您将 WebSphere ESB 用作灵活的连接性基础架构,并集成应用程序和服务以支持 SOA 的技术资源。 - WebSphere ESB 开发指南
开发指南手册(PDF 格式)。 - WebSphere ESB 产品页面
产品描述、产品新闻、培训信息和支持信息,等等。 - WebSphere ESB 文档库
WebSphere ESB 产品手册。 - WebSphere ESB 常见问题
关于 WebSphere ESB 产品及其与其他 ESB 产品关系的基础问题和解答。 - WebSphere ESB 支持
通过该数据库可搜索到支持方面的问题及其解决办法,此外还包含有下载、补丁和问题追踪。 - 调整 IBM Java 虚拟机
该主题来自 WebSphere Application Server 信息中心,提供了有关调整 IBM Java 虚拟机的详细说明和信息。
- WebSphere ESB 信息中心
- WebSphere 资源
- developerWorks WebSphere 开发人员资源
面向使用 WebSphere 产品的开发人员的技术信息和资源。developerWorks WebSphere 提供产品下载、how-to 信息、支持资源以及一个免费技术库,该技术库包含 2000 多篇技术文章、教程、最佳实践、IBM 红皮书和在线手册。 - developerWorks WebSphere 应用程序集成开发人员资源
帮助您构建 WebSphere 应用程序集成和业务集成解决方案的 how-to 文章、下载、教程、培训、产品信息等资源。 - developerWorks WebSphere 业务流程管理开发人员参考资料
WebSphere BPM how-to 文章、下载、教程、培训、产品信息和其他参考资料,帮助您建模、制定、部署和管理业务流程。 - 最流行的 WebSphere 试用版下载
免费下载关键 WebSphere 产品试用版。 - WebSphere 论坛
针对特定产品的论坛,在那里获取您的技术问题的解答,并与其他 WebSphere 用户分享您的专业知识。 - WebSphere on-demand 演示
下载并观看 WebSphere on-demand 演示,了解 WebSphere 产品和技术如何帮助您的企业应对快速变化和日益复杂的商业环境。 - developerWorks WebSphere 每周时事通讯
developerWorks 新闻简讯提供了您感兴趣的主题的最新文章和信息。除 WebSphere 以外,还可以选择 Java、Linux、Open source、Rational、SOA、Web 服务和其他主题。立即订阅并设计您的定制邮件。 - IBM Press 的 WebSphere 相关图书
通过 Barnes & Noble 实现便捷的在线订购。 - 与 WebSphere 有关的活动
世界各地针对 WebSphere 开发人员的会议、商贸展览、网络广播和其他活动。
- developerWorks WebSphere 开发人员资源
- developerWorks 资源
- IBM 软件产品试用版下载
免费下载 IBM® DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 产品的试用版。 - developerWorks 博客
加入 developerWorks 用户和作者、IBM 编辑和开发人员的谈话。 - developerWorks 云计算专区
访问 IBM 或 Amazon EC2 云计算,在沙箱中测试 IBM 云计算产品,查看云计算产品和服务演示,阅读各种云计算文章,以及访问其他云计算资源。 - developerWorks 技术加油站
由 IBM 专家主持的免费技术活动可以帮助您加快学习进度,从最困难的软件项目中取得成功。这些在世界各地举行的活动包括一小时的虚拟简报、半天到全天的真实活动等。 - developerWorks 播客
收听新颖有趣的软件创新者访谈和讨论。 - developerWorks on Twitter
查看最近的 Twitter 消息和 URL。 - IBM Education Assistant
多媒体教育模块集合,帮助您更好地理解 IBM 软件产品,更高效地使用它们来满足您的业务需求。
- IBM 软件产品试用版下载