WebSphere Enterprise Service Bus V7.5 中的聚合设计模式与性能考虑事项

本文介绍了可用于 WebSphere ESB 中介流的聚合设计模式,以及在开发和部署聚合解决方案需要考虑的性能因素。


简介

聚合是一个重要的企业服务总线 (ESB) 模式。它可将单个入站请求映射到多个出站服务调用中。但在使用聚合设计模式与 IBM® WebSphere® ESB 和 IBM Integration Developer 开发中介时,需要考虑多个性能因素。本文介绍了这些性能因素,目的是让您创建高效且有效的聚合解决方案。

中介原语(mediation primitives)

本节介绍聚合设计模式开发中使用的核心中介原语组件。

Fan Out 中介原语

Fan Out 中介原语在聚合块的开始部分使用。目前支持两种模式:

  • 一次模式(Once mode):提供了实现中介流分支的功能
  • 迭代模式(Iterate mode):提供了对服务消息对象 (SMO) 内的重复结构进行迭代处理的功能

您应该为下面这种聚合设计模式使用一次模式来实现中介流分支:例如入站消息中包含的结构需要被转发给两个服务。而对于下面的聚合设计模式则应使用迭代模式:根据 SMO 内重复的结构,需要多次调用某个服务。

图 1. Fan Out 中介原语
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 中介原语
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
Service Invoke 中介原语 -- 选择 Message Enrichment Mode

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

图 4. Service Invoke 中介原语 -- Message Enrichment Mode 属性
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 消息增强模式

在 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
BOMapper 中介原语 -- 不传播 /body

其他内存考虑事项

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

图 10. BOMapper 中介原语 -- 不传播 /context
BOMapper 中介原语 -- 不传播/context

结束语

聚合是一个重要且强大的 ESB 模式,但是在开发和部署可使用聚合的 WebSphere ESB 中介流之前,需要了解并评估多个性能考虑事项,这包括:

  • BOMapper 和 XSLT 中介原语的运行时性能
  • 大批量的请求处理对同一位置其他服务的影响
  • 通过聚合块和中介流进行的消息数据传播

参考资料

学习


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值