同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务

IBM®WebSphere®Enterprise Service Bus(以下称为WebSphere ESB)提供了Callout Node和Service Invoke中介原语,以使中介流能够访问外部服务。 WebSphere ESB还为您提供了同步或异步调用样式的选择。 通常,建议使用同步服务调用,因为它们具有较少的处理开销并提供更好的性能。 但是,在某些情况下,异步调用可以减少应用程序的总体响应时间,因此是首选方法,例如在同时调用多个长期运行的服务时。

聚合块可用于执行多个服务的并发异步调用,并且本文介绍了如何实现并确保此设计模式的最佳性能。

异步调用同步服务

服务调用调解原语的调用样式的选择可能会对性能产生深远的影响,因此在进行选择时应格外小心。 异步调用有更多的开销,因为它们必须被序列化,通过消息传递层传递并在接收线程处反序列化。 但是在呼叫者不想等待请求完成的情况下,异步调用是首选。 一种这样的场景是同时调用多个具有可测量延迟的服务,以减少应用程序的总体响应时间。 这是三种调用样式的摘要:

表1. Service Invoke中介原语使用的调用样式
调用方式 描述
同步 线程阻塞并等待响应,并且响应在同一线程上返回。 使用服务组件体系结构(SCA)调用的调用样式。
与延迟响应异步 线程等待响应。 如果服务调用调解原语不在聚合块中,则线程在每个服务请求之后等待,直到收到响应为止。 如果服务调用调解原语位于聚合块中,则可以在线程等待对所有未完成服务请求的响应之前执行聚合的进一步处理。 在这两种情况下,都使用SCA invokeAsync样式。 对于请求-响应操作,invokeResponse用于从服务中检索响应,您可以使用async timeout属性指定等待响应的最长时间。 如果存在现有事务,则等待会在现有事务内部发生,因此该等待也受全局事务超时约束。
与回调异步 原始线程不等待响应或回调,而是继续,并且调用服务调用中介原语的输入端连接的任何其他中介原语。 在新线程上接收到Service Invoke响应,该线程继续来自Service Invoke中介原语的中介流。

本文使用“具有延迟响应的异步”调用样式,并且在下面描述的设计模式中,来自聚合块内的调用必须使用此调用样式来实现同步服务的并发调用。 下图显示了从聚合块中异步调用同步服务的步骤:

图1.同步服务的异步调用
同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务
  1. 服务调用中介原语异步调用同步服务。 请求消息被序列化并放置在与中介流关联的SCA队列点上。 在线程等待响应之前,将继续对聚合块进行处理。
  2. **规范使用请求消息来调用MDB。
  3. MDB同步调用服务提供者。
  4. 服务提供商响应该请求。
  5. MDB将响应消息放回与中介流关联的SCA队列点。
  6. 响应消息将传递回原始中介流线程以继续进行处理。

中介原语

本节描述了在聚合设计模式的开发中使用的核心中介原语组件,以执行多个长期运行的同步服务的并行异步调用。

扇出

扇出调解原语用于聚合块的开头。 支持两种模式:

  • 一次性模式 -提供分支调解流程的功能
  • 迭代模式 -提供对服务消息对象(SMO)中的重复结构进行迭代的能力

使用“一次”模式可以为聚合设计模式分支中介流,例如,入站消息包含需要转发到多个服务的结构。 将迭代模式用于聚合设计模式,在该模式下,需要根据服务消息对象(SMO)中的重复结构多次调用服务。

图2.扇出调解原语
同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务

扇入

Fan In中介原语用于聚合块的末尾,并与相应的Fan Out原语配合。 Fan In支持三种类型的决策点,这些决策点控制何时触发Fan In原语的输出终端-何时满足指定的决策点并且何时接收到的最后一条消息传播到输出终端:

  • 简单计数 -输入终端收到指定数量的消息时,将触发输出终端。
  • XPath决策 -XPath表达式的值为true时,将触发输出终端。
  • 迭代 -当输入终端接收到相应的“扇出”调解原语产生的所有消息时,将触发输出终端。

在聚合解决方案中,可能多次到达XPath决策点和“简单计数”决策点,从而导致输出终端多次触发。 迭代决策点使输出端子仅触发一次。

图3. Fan In中介原语
同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务

服务调用

在“扇出”和“扇入”中介原语之间使用“服务调用”中介原语来调用所需的服务。 在将Service Invoke中介原语添加到IBM Integration Developer中的画布时,请选择要由该原语执行的引用和操作。

异步超时属性指定当呼叫与延迟响应异步时等待响应的时间。 调用样式定义服务是异步同步还是异步调用。

图4.服务调用中介原语
同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务

聚合设计模式中并行调用同步服务

聚合是一种重要的ESB模式。 它使单个入站请求能够映射到多个出站服务调用中,来自这些调用的响应可以聚合为单个响应并返回到原始请求。 您可以使用前面描述的“一次”或“迭代”操作模式来实现本文中描述的设计模式,从而基于同一入站请求并行启用单个或多个目标服务的多个异步调用。

在以下银行业务场景中,将为单个入站请求调用两个服务。 入站请求包含有关特定帐户的信息,并且消息元素设置器调解原语在请求进入聚合块之前在SMO的瞬态上下文中存储RequestID字段。 “扇出”调解原语在“一次”模式下配置,并且调解流分为两个分支:第一个分支调用服务以检索帐户信息摘要,第二个分支调用服务以检索帐户的交易历史记录。 “扇入”调解原语配置为在两次触发输入端子之后触发输出端子。

在调用每个服务之前,BOMapper中介原语会将消息转换为正确的格式,紧随每个服务调用中介原语之后的BOMapper中介原语然后将给定的响应存储在SMO的共享上下文中。 当在输入终端上收到两个响应时,将触发Fan In中介原语的输出终端,并且最终的BOMapper中介原语聚合存储在共享上下文和瞬态上下文中的信息以创建对初始请求的响应:

图5.聚合中介流
同步websphere时间_WebSphere Enterprise Service Bus中并行调用同步服务

将“服务调用”调解原语的调用样式配置为异步可以启用同步服务的并行调用。

性能考量

服务调用调解原语的调用样式可能会对性能产生深远影响,因此在选择调用样式时应格外小心:

  • 同步 -每个分支以及每个服务调用均按顺序处理,并且流的总响应时间将至少是服务响应时间的总和。
  • 异步 -每个分支依次执行,直到遇到Service Invoke中介原语为止,此时服务调用将通过消息传递层传递到单独的线程,并且中介流线程的处理移至下一个分支。 在寻找来自服务提供者的响应之前进行所有服务调用,这时各个分支的执行继续。 服务调用是同时执行的,因此总响应时间将至少等于所调用服务的最长响应时间。

如果被调用服务的预期响应时间之和不明显大于任何一个服务的最长响应时间,则由于异步调用会产生额外的逻辑和流程,因此同步调用可能会提供更好的性能。

在开发中介流时,在设置适当的异步超时值时,请注意连接分支的顺序和调用服务的顺序。 首先调用预期延迟最大的服务,以便在同时调用其他服务时可以进行外部处理。 还应该配置适当的超时值,因为聚合逻辑使用它们来确定首先寻找哪个响应。 为调用的服务适当设置超时值可确保聚合逻辑有效地工作。

因为此设计模式的实现会导致SCA层内进行其他处理,所以除了调整Web服务并确保正确配置服务器之外,还存在其他性能调整建议。 进程中使用的MDB在单独的线程池上运行,该线程池需要正确调整大小,以防止它成为瓶颈。 另外,由于SCA队列的使用增加,因此需要确保正确调整JMS资源工件和消息传递引擎。

Java堆大小

不适当的Java堆大小可能会产生不良影响,例如增加垃圾回收(GC)的暂停时间,Java堆耗尽,甚至出现内存错误。 Java为WebSphere ESB提供了运行时环境,因此Java配置会影响性能和系统资源消耗。

如果Java堆太小,GC将被触发得太频繁,您可能会耗尽可用内存。 增加Java堆大小将解决此问题,但是它将增加GC之间的间隔,并允许在Java堆上累积更多的对象,这意味着在触发GC时,将需要更多的时间来处理分配失败,并且应用程序的响应速度会降低。 Java堆的大小应适合40%至70%的占用率,并且由于WebSphere ESB工作负载中的对象通常具有短暂的事务性,因此建议采用世代GC策略(-Xgcpolicy:gencon)。

托管中介模块的服务器将处理与托管消息传递引擎的服务器不同的工作负载,因此,应针对它们正在处理的工作负载独立调整每个服务器。 有关调整Java堆大小和调整Java堆的更多信息和最佳实践,请参阅本文底部的“ 相关主题 ”。

线程池

WebSphere ESB服务器使用线程池管理并发任务,这些线程池的大小会影响服务器并发运行应用程序的能力。

要在管理控制台中设置线程池的最大大小属性,请单击服务器=>应用程序服务器,然后选择要管理其线程池的服务器名称。 单击其他属性=>线程池 ,然后单击线程池名称。

WebContainer线程池用于处理传入的HTTP和Web服务请求。 该线程池由服务器上部署的所有应用程序共享,并且您必须针对服务器的入站请求并发进行必要的调整。

SCA模块MDB使用平台消息组件SPI资源适配器。 它为MDB线程使用缺省线程池,但是缺省线程池由许多WebSphere Application Server任务共享,因此您应该将MDB的执行分离到专用线程池。 更改用于SCA模块MDB的线程池:

  1. 在服务器上创建一个新的线程池(例如SCAMDBThreadPool):单击服务器=>应用程序服务器 ,选择服务器名称,单击其他属性=>线程池 ,然后单击新建
  2. 从具有服务器范围的管理控制台中打开平台消息组件SPI资源适配器:单击资源=>资源适配器=>资源适配器 然后转到首选项 ,然后选择显示内置资源
  3. 将线程池别名从Default更改为SCAMDBThreadPool
  4. 对节点和单元作用域的“平台消息组件SPI资源适配器”重复步骤2和3。
  5. 重新启动服务器,以使更改生效。

然后,必须为SCA模块MDB的预期并发度确定SCAMDBThreadPool的大小,该期望并发度应等于对中介模块的入站请求的预期并发度乘以使用上述设计模式同时调用的服务数量。

com.ibm.websphere.webservices.http.maxConnection属性指定在HTTP出站连接器连接池中创建的最大连接数。 您只能将属性配置为JVM定制属性:在管理控制台中,单击服务器=>应用程序服务器 ,选择服务器,单击Java和Process Management =>进程定义=> Java虚拟机=>定制属性 ,然后创建一个新属性(如果尚不存在)。 此属性影响在一个JVM中建立的所有Web服务HTTP连接。 当达到最大连接数时,不会创建新的连接,并且HTTP连接器将等待当前连接返回到连接池。 调整最大连接数,使其等于SCAMDBThreadPool的大小。

讯息传递

每个中介模块在Java命名和目录接口(JNDI)中都有一个相应的**规​​范,其中将包含带有后缀_AS的中介模块名称。 **规范的maxConcurrency的默认值为10,这意味着可以同时将JMS队列中的10个业务对象同时传递到MDB线程。 该值应等于对中介模块的入站请求的预期并行性乘以使用所述设计模式同时调用的服务数。

**规范中的最大批处理大小也会影响性能。 默认值为1。最大批处理大小决定了从消息传递层提取多少消息并在单个步骤中将其传递到应用程序层。 稍微增加该值可以在某些情况下提高性能,但是在等待批处理完成时,添加到批处理中的第一条消息的响应时间可能会增加。 因此,对于该设计模式,通常应将该值保留为1。

还建议您为SCA目标适当地配置服务质量(QoS)。 默认可靠性为“ 确保持久性” ,但是由于本文介绍了处理Web服务和HTTP工作负载管理员的情况,因此您应将可靠性级别降低为“ 快速非持久”,以提高性能。 您可以从管理控制台配置SCA目标:单击“ 总线=> sca_system_bus_name =>目标=> destination_name ,其中destination_name包含带有前缀sca /的中介模块名称。 禁用“ 允许生产者覆盖默认可靠性”复选框,并将默认和最大可靠性值更改为Express nonpersistent

消息传递引擎的sib.msgstore.cachedDataBufferSize大小也应适合工作负载。 缓存的数据缓冲区用于通过在内存中缓存消息引擎可能从数据存储中读取的数据来优化消息引擎的性能。 此高速缓存的大小显然受内存限制的控制,但应至少为使用中介层描述的设计模式乘以平均消息大小所得的,对中介模块的入站请求的预期并发性乘以并发调用的服务数量的两倍。 在管理控制台中设置缓存大小:选择服务集成=>总线=> bus_name => [拓扑]消息引擎=> engine_name => [其他属性]自定义属性

初始配置

如果不确定如何选择系统中的初始设置或期望的并发性,则可以从以下一些出发点进行调整,以对具有代表性的工作负载进行测试:

表2.初始配置设置
零件 组态
Java堆 -Xms20480m -Xmx2048m -Xgcpolicy:gencon -Xmn1024m
线程池 WebContainer:50,SCAMDBThreadPool:50 *并行服务调用数
HTTP / Web服务 com.ibm.websphere.webservices.http.maxConnection = 50 *并行服务调用数
**规范 maxConcurrency:50 *并行服务调用数,maxBatchSize:1
SCA队列 禁用“ 允许生产者覆盖默认可靠性”复选框。 默认可靠性可以是Express nonpersistentMaximum Reliability:Express nonpersistent
讯息引擎 sib.msgstore.cachedDataBufferSize = 40000000(40MB)

结论

以聚合设计模式实现同步服务的并行调用可以显着改善应用程序的响应时间和性能,但是需要进行性能调整以确保成功的解决方案:

  • 根据该服务器的工作量为每个服务器调整Java堆的大小。
  • 为Platform Messaging SPI资源适配器配置专用的线程池,并根据服务器中预期和要求的并发性来调整线程池的大小。
  • 根据需要增加HTTP连接的最大数量。
  • 调整SCA模块MDB使用的**规范以获得所需的并发性。
  • 为SCA队列定义适当地定义QoS。
  • 调整消息传递引擎的sib.msgstore.cachedDataBufferSize。
  • 请注意有关服务调用顺序和异步超时的定义。

翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1312_ross/1312_ross.html