编辑: gracecats | 2015-12-16 |
2011 年7月21 日IBM WebSphere Process Server (WPS) 是目前主流的业务流程集成服务器,它从公认的业务集成 概念、应用程序服务器技术和最新开放式标准发展而来.
WPS 的性能调优是最大程度发挥出 WPS 的性能优势的一个重要步骤,也是 WPS 使用过程中的一个难点.提高 WebSphere Process Server ( 以下简称 WPS) 性能是一个综合复杂的工程,在WPS V6.2 性能调优系列文章 中,我们已 经比较详细的介绍了如何通过设置 WPS 的参数来提高 WPS 应用程序的性能,但是优化 WPS 的参 数设置并不是提高 WPS 性能的唯一途径.WPS 应用程序的开发设计也会对 WPS 运行的性能起到 决定性影响,好的开发设计可以极大提高 WPS 运行的性能,反之,不当的 WPS 应用程序开发设 计则会降低 WPS 的性能. 本系列文章主要针对 WPS V7 应用程序的调优,通过深入的 WPS 工作原理介绍由浅入深的介绍了 如何对 WPS V7 进行性能调优,以便实现 WPS 的最佳性能. 本文将详细探讨事务设置以及如何通过正确设置事务提高 WPS 的性能. 查看本系列更多内容 引言 WPS V7 应用程序中的事务设置是开发过程中必须要考虑的一个方面,事务设置对于部署在 WPS 上 的应用程序的运行性能起到很大影响.本文将结合具体案例较详细的介绍 WebSphere Process Server V7 版本的应用程序中设置事务的方式方法,以及如何通过正确设置事务来提高 WPS 应用程序的运 行性能. 事务设置介绍 在讲解如何通过设置事务提高 WPS 应用程序性能之前,我们首先要了解一下 WPS 中事务的定义和 设置方法. developerWorks? ibm.com/developerWorks/cn/ WebSphere Process Server V7 性能调优,第2部分: 事务设置 第2页,共14 事务是一组活动单元,在一个事务中,一组对于资源的更新活动将以原子的方式执行.进一步说, 要么事务中所有的资源更新都被执行并被永久保存,要么没有任何资源更新被永久保存. WPS 是基于 SCA 和BPEL 流程引擎的流程服务器,因此对于 WPS 应用程序来讲,我们可以在 SCA 组 件和 BPEL 业务流程两个层面来设置事务,除此之外我们还要单独介绍一下异步调用中一个特殊的事 务设置. SCA 组件级别的事务 在SCA 组件级别上,我们看到的是一组 SCA 组件的相互调用,不同 SCA 组件或属于一个事务,或 属于不同的事务.SCA 组件可以有多种实现,如BPEL、Java、Interface Map、Business Rule 等等. 图1中有
3 个SCA 组件(1 个长流程、1 个短流程和一个 Java 组件)、1 个Web Service 导入和
1 个Web Service 导出构成,它们可以属于同一个事务,也可以分别属于不同的事务.我们可以看到短流 程(MircoflowProcess1)调用 Java 组件(JavaComponent1),如果它们在一个事务中,则他们中对 于资源的操作要么在它们全部 SCA 组件执行成功时全部被提交,要么它们对于资源的操作在其中任 何一个 SCA 组件出错后全部回滚. 图1. 模块组装视图 上面我们简要介绍了 SCA 组件的事务,进一步我们将介绍如何设置 SCA 的事务. SCA 的事务是通过设置服务质量限定符(QoS Qualifier)来实现的. 对于 SCA 组件,服务质量限定 符(QoS Qualifier)可以在三个地方设置: ?? 接口 (Interfaces) ?? 引用 (References) ?? 实现 (Implementations) 在接口上可以设置的服务质量限定符有一个: Join transaction:此限定符决定了目标服务是否有能力加入到客户端 (client) 发起的事务中.Join transaction 限定词在 WPS V7 版本中有两个选项: ?? True:服务组件加入到客户端传播过来的事务中. ?? False:服务组件不加入到客户端传播过来的事务中. 图2给出了如何在 WID V7 中设置 Join transaction. ibm.com/developerWorks/cn/ developerWorks? WebSphere Process Server V7 性能调优,第2部分: 事务设置 第3页,共14 图2. 设置 Join Transaction 注意当 Join transaction 设置为 True 时并不意味着目标组件服务(当前 SCA 组件服务)一定会加入 到客户端(调用者)的事务中.只有满足一系列条件时才能真正加入到客户端的事务中. Join transaction 设为 True 生效的条件: ?? 调用端发起的必须是同步调用 (关于同步异步调用,请参考 developerWorks 文章: WebSphere Process Server V7 性能调优,第1部分 : 调用样式).异步调用是不能将目标服务 加入到事务中的.也就是说当客户端使用异步调用的方式发起调用,Join transaction 限定词将 被忽略,不会加入客户端的事务中. ?? 目标服务组件实现中的 Transaction 限定符必须设为 Global (关于目标服务组件 Transaction 限 定符,请参考下文的详细介绍). 如果满足上述两个条件并且 Join transaction 设置为 False,或者不满足上述任意一个条件时,目标服 务组件都不会加入到客户端(发起端)的事务中. 在实现(Implementations)上可以设置的服务质量限定词有一个: Transaction:决定服务组件功能 单元的逻辑划分.Transaction 限定词在 WPS V7 版本中可以有四个选项. ?? Global:若客户端发起并传播了全局事务 (Global transaction), 并且目标组件(SCA 组件)设置 为加入事务(Join transaction 为True),那么该组件将加入到客户端发起的全局事务中.如果 不满足上述条件,则目标组件将为自己新建一个全局事务. ?? Local:如果目标组件不支持两阶段提交,则需要设置为 Local.当设为 Local 时,目标组件将运 行于自己的局部事务中,既不会加入到客户端的事务中,也不会让被它调用的服务组件加入到 自己的局部事务中. ?? Any:若客户端传播过来全局事务上下文 (global transaction context),则服务组件加入到全 局事务中.否则目标组件将创建自己的局部事务. ?? Local Application:当目标组件运行于局部事务容器(Local transaction containment),且局部 事务容器由应用程序负责管理时选择此选项.换句话说,当设为 Local Application 时,相当于 Transaction 服务质量限定词被设为不支持,并且 LocalTranResolver 设为 application.事务由应 用程序自己负责管理提交或回滚. 图3给出了如何在 WID V7 中设置 Transaction. developerWorks? ibm.com/developerWorks/cn/ WebSphere Process Server V7 性能调优,第2部分: 事务设置 第4页,共14 图3. 设置 Transaction 在引用(References)上可以设置的服务质量限定词有一个: Suspend transaction:当服务组件本身 作为客户端同步调用目标组件时,此选项决定客户端是否将事务传播给被调用的目标组件.Suspend transaction 限定词在 WPS V7 版本中有两个选项. ?? False:客户端的全局事务向目标组件传播,目标组件与当前服务组件(客户端)在一个全局事 务中. ?? True:客户端的全局事务不会向目标组件传播,目标组件将运行于自己的全局事务中或局部事 务中. 注意如果当前服务组件使用的是局部事务,或者是异步调用目标服务组件,那么 Suspend transaction 限定词将被忽略.图4给出了如何在 WID V7 中设置 Suspend transaction. 图4. 设置 Suspend transaction 上面我们介绍了 SCA 组件级事务,下面我们将介绍业务流程(BPEL)级别的事务设置. 业务流程(BPEL)级别的事务设置 SCA 组件中的 BPEL 实现有着自己的事务控制,因此我们将在这节中介绍业务流程中的事务控制方 式,不同的事务设置将对性能产生影响. BPEL 支持两种业务流程,分别是短流程(Microflow)和长流程(long-running).两种流程的事务 行为是不一样的,因此我们下面将分别介绍. 短流程 ibm.com/developerWorks/cn/ developerWorks? WebSphere Process Server V7 性能调优,第2部分: 事务设置 第5页,共14 短流程用于短时间存在的流程,短流程总是存在于一个事务中,状态记录于内存中,而不会记录到 数据库中.因此短流程的性能很高,但是短流程不能用于调用一个长时间才能返回的服务,否则 就会出现事务超时,从而整个短流程的事务都会回滚.虽然短流程内的所有活动都存在于一个事务 中,但是被短流程调用的服务不一定与短流程在一个事务中,会受到 SCA 组件服务质量限制符和 调用方式的影响.SCA 组件服务质量限制符的影响上文已经叙述过了,在此不在叙述,而调用方式 同样会影响事务的行为,只有同步调用才能够使多个服务组件加入短流程的全局事务,而异步调用 不能使客户端(调用方)和目标组件(被调用方)存在于一个事务中.具体的调用方式行为请参考 DeveloperWorks 文章:WebSphere Process Server V7 应用程序中调用样式介绍及性能调优. 长流程 长流程相对于短流程而言其存活时间非常长,可以运行数小时到数天甚至数年的时间.长流程通常 跨越多个事务,每个事务通过 JMS 或Work-Based-Manager 发起.在WPS V7 版本之前,JMS 导航为 默认的导航方式,从WPS V7 版本开始,Work-Based-Manager 被设为默认的流程导航方式,性能和 稳定性都得到提高. 在长流程中,每个活动都可以拥有自己的事务,您也可以通过设置事务来影响 活动的事务行为,但是请注意 WPS 的流程管理器拥有最终控制权来决定最终事务的实际行为,因此 您可以通过设置事务行为来影响活动的事务行为从而提高性能,但是在功能上您不能依赖于您设置 的事务行为. 您可以通过设置事行为来影响活动的事务行为.共有如下四个选项: ?? Commit before:之前的事务结束,当前的活动启动一个新的事务. ?? Commit after:当前活动加入到之前的事务中,并且在此活动结束时提交事务,下一个跟着的 活动会重启一个新事务. ?? Participates:当前的活动加入到之前的事务中,并且在此活动结束后是否提交事务取决当前活 动的种类以及于下一个活动的事务行为设置. ?? Requires own:之前的事务结束,当前的活动启动一个新的事务,并且在当前活动执行之后提 交当前事务. 图5给出了如何在 WID V7 中设置 BPEL 长流程中活动的事务. 图5. 设置 BPEL 长流程中活动的事务 被长流程调用的服务不一定与长流程中的活动在一个事务中,会受到 SCA 组件服务质量限制符和调 用方式的影响.具体影响方式可以参考上文中关于短流程的介绍. 对于平行分支(parallel branches)的并行导航,为了达到每个分支的并发性,每个分支都要在开 始点启动一个自己的事务,也就是说每个分支的第一个活动的事务行为应该设为 Commit before 或Requires own.只有这样才能保证每个分支拥有自己的事务,从而达到并行处理. developerWorks? ibm.com/developerWorks/cn/ WebSphere Process Server V7 性能调优,第2部分: 事务设置 第6页,共14 图6给出了一个具有两个分支的平行分支结构,为了达到并发性,第一个活动的事务行为应设为 Commit before 或Requires own. 图6. 平行分支结中的事务设置 对于长流程更加详细的介绍,建议参考 WPS V7 信息中心文档. 异步调用中的事务设置 上文分别介绍了 SCA 级别和业务流程级别的事务设置,还有一个参数与异步调用时的事务相关, 在此做一补充.在引用的服务质量配置页面上有一个限制符,称为 Asynchronous invocation, 请 参看图 7.这个参数很多 WPS 使用者都有迷惑,到底是起什么作用.其实这是在异步调用时的一 个控制事务的选项.我们知道在异步调用时,客户端要通过发送消息调用目标端提供服务.客户端 有两个阶段的动作:首先进行自身的业务处理,然后发起异步调用(也就是向队列发送消息). 这里就有一个事务相关的问题,消息发送是否与之前的业务处理处于一个事务中.Asynchronous invocation 就是用于设置消息发送是否加入客户端自身的事务中.如果将 Asynchronous invocation 设置为 call ,那么发送消息就独立于客户端自身的事务,不论客户端事务是否最终回滚,消息都将 发送到队列中.如果将 Asynchronous inv........