内容


操作 WebSphere Process Server 环境,第 2 部分

维护最佳 Business Process Choreographer 数据库大小的方法

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 操作 WebSphere Process Server 环境,第 2 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:操作 WebSphere Process Server 环境,第 2 部分

敬请期待该系列的后续内容。

简介

WebSphere Process Server 依赖于许多后端数据库或数据库表。其中一些存储与业务相关的数据,比如 Enterprise Service Bus (ESB) 日志仲裁表存储消息信息,Common Event Infrastructure (CEI) 数据库存储公共事件数据。WebSphere Process Server 后端数据库中存储的最常用的数据是与业务过程和人工任务相关的信息。本文讨论如何处理这些工件,从而维护稳定的 WebSphere Process Server 环境。

长时间运行的业务过程和人工任务存储在 Business Process Choreographer (BPC) 数据库中。这个数据库用于保存正在使用的数据,比如未完成的长时间运行的过程实例和未完成的人工任务。这包括正在执行的实例以及需要人工干预的实例,比如包含处于停止状态的活动的实例。

在 Business Process Choreographer 数据库 (BPEDB) 中保留已完成的实例对操作环境不利,比如占用大量磁盘空间或导致性能下降。因此,不应该在 BPEDB 中保留已完成实例。另外,实例数据只反映实例当前的状态。访问实例数据的任何工具(比如 BPC Explorer)只显示当前实例数据的快照。因此,BPEDB 不应该 用于审计和报告。

有助于实现最佳 BPC 数据库大小的应用程序设计模式

实现最佳 BPEDB 大小有两种方法:

  • 确保尽快删除已完成实例。
  • 确保数据库中的项目尽可能小。

第二种方法取决于应用程序的设计。一些设计决策会影响过程实例在 BPEDB 中需要的空间,比如使用微型流还是长时间运行的过程、业务过程中使用的业务对象的大小以及分配给人工任务的人员数量。大多数设计决策属于一般 WebSphere Process Server 最佳实践,因此本文 讨论它们。

一种影响数据库大小的常用设计模式是引入 “心跳” 或 “调度器” 应用程序。例如,可以运行一个应用程序,它定期检查后端服务的可用性和响应时间。

实现这种心跳或调度器应用程序有多种方法。一种方法是创建一个长时间运行的业务过程,它以指定的时间间隔调用后端服务。这种过程常常具有一个 while 活动,否则将重复,直到该活动与 wait 活动相结合,这指定了在下一次调用后端服务之前等待的时间。为了实现最佳的 BPEDB 大小,建议不要使用这种业务过程模式。对于长时间运行的业务过程中循环的每次迭代,都要在 BPEDB 中存储数据。例如,补偿和恢复使用的变量数据或与活动相关的数据。

这些数据中的大多数会在循环的下一次迭代中删除。但是,并非所有数据都被清除,为了进行以后的处理,可能需要保留一些数据。如果这样的心跳或调度器过程实例运行几个月,数据库中与它相关的数据会不断增加,它们占用的磁盘空间可能导致问题。在删除长时间运行的心跳或调度器过程实例时,如果使用 BPC API,就可能会失败,因为所有操作都在一个事务中执行。为了缓解在这种情况下大型事务产生的问题,可以采用以下方法之一:

  • 使用 deleteCompletedProcessInstances.py 脚本。使用多个事务。
  • 增加事务日志文件的大小。

为了避免 BPEDB 中的数据不断增长,可以按以下两种方式设计心跳或调度器应用程序:

  1. 在设计业务过程时,让过程实例调用后端服务,然后在一个 wait 活动中等待指定的时间;完成这些操作之后不会重新循环到初始部分,而是调用一个新的过程实例以重复这些步骤,直到完成过程。要考虑到以下两点:
    1. 被调用的过程一定不能加入到原始过程实例的生命周期,这意味着 autonomy 必须设置为 “peer”(而不是 “child”)。
    2. 调度器或心跳过程应该设置为 auto-delete。
  2. 使用 WebSphere Scheduler 定期启动一个调用后端服务的业务过程。采用这种方法的示例见 使用 WebSphere Application Server 调度服务定期启动 WebSphere Process Server 过程

对于实现最佳 BPEDB 大小,要考虑的另一个设计模式是使用组工作项。对于大的组使用组工作项(people assignment criterion: Group),而不是对组成员使用单独的工作项(people assignment criterion: Group Members)。这通常会提高查询性能。

已完成的实例

业务过程和人工任务支持几个生命周期选项。业务过程实例或人工任务实例的执行方式(作为对等实例或依赖的子实例)决定了在执行完之后如何删除它。

已完成的过程实例

当过程实例到达结束状态(finished、terminated 或 failed)之一时,它们就完成了。

过程可以调用其他过程(称为 “子过程”)。这些子过程作为发出调用的过程的对等过程或子过程运行。过程级属性 “autonomy” 决定子过程是作为对等过程运行,还是作为子过程运行。对等过程的生命周期独立于发出调用的过程的生命周期,而子过程的生命周期依赖于发出调用的过程(父过程)的生命周期,见图 1。

图 1. 父和子过程实例的生命周期操作
父和子过程实例的生命周期操作
父和子过程实例的生命周期操作

因此,不能独立地删除子过程。如果父过程被删除,子过程会被自动地删除。关于业务过程生命周期的更多信息参见 过程生命周期

已完成的人工任务实例

影响业务过程的考虑因素也适用于人工任务。

有两种人工任务:内联的和单独的。内联的人工任务 是业务过程内的人工任务活动。这种任务一般由业务过程管理,当包含它的业务过程被删除时就会被删除。不能独立地删除内联的任务。但是,这条规则有一个例外。当删除业务过程时,通过 HTM API 创建的内联调用任务不会被删除。清除这些实例必须执行额外的人工操作。独立的人工任务 一般有自己的生命周期。

从 WebSphere Process Server V6.2 开始,引入了所谓的子独立人工任务。这让独立的人工任务可以加入发出调用的业务过程的生命周期。如果使用这个选项,那么当父业务过程被删除时这些独立人工任务也会被自动地删除(见图 2)。

图 2. 父过程实例和子人工任务实例的生命周期操作
父过程实例和子人工任务实例的生命周期操作
父过程实例和子人工任务实例的生命周期操作

关于人工任务生命周期的更多信息参见 人工任务生命周期

清理方法

当业务过程或人工任务进入结束状态之后,就可以删除它。可以使用几种不同的删除方法。

可以自动地删除业务过程实例和人工任务实例。按这种方式,当它们到达结束状态时,WebSphere Process Server 就会删除它们。

如果实例需要保留一段时间(比如为了让管理员可以检查或纠正某些东西),那么可以使用 Human Task Manager 提供的选项在指定的时间段之后自动地删除实例。但是,使用这个选项要小心。正如前面指出的,已完成的实例一般不应该保留在 BPEDB 中。

考虑到性能需求,把实际删除实例的操作转移到系统利用率低的时候执行可能是有意义的。例如,如果 WebSphere Process Server 环境在上午 8 点到下午 5 点之间使用量很大,而在夜间根本不使用,那么可以在夜间删除实例,从而避免在工作负载高的时间段给系统造成额外的负担。有几个方法可以满足这一需求。WebSphere Process Server 为调度已完成实例的删除提供了脚本和选项。

除了这些方法之外,还可以使用 BPC Explorer 删除实例。这种方法通常用来删除已经由管理员检查过的实例。

WebSphere Process Server 提供几个 API 函数,如果以上方法都不满足环境的需求,可以使用这些函数删除实例。

下面详细解释已经提到的所有方法。

自动删除已完成的实例

在过程实例完成时自动删除它们有两种方法。可以在过程到达任何结束状态(finished、failed 或 terminated)时删除,也可以只在到达 “finished” 结束状态时删除。

从 WebSphere Process Server V6.1 开始,后一个选项 “On successful completion” 是默认选项(图 3)。只保留可能需要进一步管理的过程实例(例如失败和终止的实例),而成功完成的实例被自动删除。这是合理的,因为管理员可能希望分析过程的失败原因,甚至重新启动失败的过程实例。

图 3. 在 WebSphere Integration Developer 中设置业务过程的自动删除选项
在 WebSphere Integration Developer 中设置业务过程的自动删除选项
在 WebSphere Integration Developer 中设置业务过程的自动删除选项

对于需要优化以改进响应时间性能的业务过程,可以考虑把已完成实例的删除推迟到系统利用率低的时间段。后面会提供关于推迟删除的更多信息。

对于人工任务,实际上有两种默认清理场景:

  • 在默认情况下,to-do 任务在它们已经把响应返回给任务的调用者之后删除。这对应于长时间运行的过程的默认设置。
  • 在默认情况下,invocation 任务和 collaboration 任务由启动任务的人删除。这意味着在默认情况下它们不会自动地删除。

可以定制人工任务建模器的默认行为,从而保留不再需要的人工任务。另外,可以指定 duration until the task is deleted 值,也就是从到达结束状态到删除之间的时间。对于这些自动删除选项,还可以指定是否只删除成功完成的任务(图 4)。可以手工删除失败和终止的任务。

图 4. 在 WebSphere Integration Developer 中设置人工任务的自动删除选项
在 WebSphere Integration Developer 中设置人工任务的自动删除选项
在 WebSphere Integration Developer 中设置人工任务的自动删除选项

通过脚本删除已完成实例

WebSphere Process Server 提供脚本 deleteCompletedProcessInstances.py,它根据特定的查询条件从 BPEDB 中有选择地删除已完成的过程实例和相关数据。

可以按以下条件选择实例:

  • 特定的过程模板
  • 特定的启动者
  • 完成实例之前的指定日期/时间
  • 特定的结束状态,比如 finished、terminated 或 failed

这个脚本可以实现推迟删除实例等功能。还有一个 MBean 接口也提供这些功能。使用这种方法删除实例需要 WebSphere Administrator 特权。

使用这个脚本的语法如下:

deleteCompletedProcessInstances.py
     [([-node <nodeName>] -server <serverName>) 
     | (-cluster <clusterName>)]
     (-all | -finished | -terminated | -failed )
     [-templateName <templateName> [-validFrom <timestamp>]]
     [-startedBy userID ]
     [-completedBefore <timestamp>]

这个脚本请求删除所选的过程实例及其子过程。实例在它们自己的全局事务中一个接一个地删除。有时候,由于某些原因,无法在一个全局事务中删除过程实例,例如在完成删除之前事务超时了。在这些情况下,BPC 会做出反应,在多个全局事务中删除实例。

完成删除操作之后,脚本返回删除的过程实例的数量。注意,对于 wsadmin 客户机和服务器之间的 SOAP 连接,指定的默认超时值是 3 分钟。到达这个时间之后,到服务器的连接就会中断,这意味着删除的实例的数量无法发送回给客户机。但是,服务器上的删除操作不受此影响,会继续处理。

删除实例的另一种方法是使用 bpcTemplates.jacl 脚本。这个脚本启动和停止过程模板,卸载业务过程和人工任务应用程序。

在一般情况下,在卸载由过程或任务组件组成的应用程序时,要求在卸载之前没有执行相应的过程和任务实例。

从 6.0.2 开始,bpcTemplates.jacl 脚本允许指定 force 选项,这会在仍然存在过程或任务实例的情况下卸载应用程序。这个选项应该是最后的手段。建议不要 使用这个删除选项。

这里讨论的所有脚本都提供 “validFrom” 参数。这里采用的时间戳格式是 UTC。有时候,不容易确定 UTC 格式的 validFrom 数据,因为管理控制台以本地时区格式显示时间戳。从 V6.2.0.2 开始,bpcTemplates.jacl 脚本提供 “list” 参数,可以使用它轻松地确定应用程序的任何过程或任务模板的 UTC 时间。

调度已完成实例的删除

删除过程实例会在数据库系统上产生很重的负载。在系统正常操作时间段,这会显著影响性能,降低系统的响应速度。因此,如果在某些固定的时间段 WebSphere Process Server 系统上的负载比较低,比如星期日早上 3 点,那么可以利用这段时间删除过程实例。为了自动执行这些重复的任务,WebSphere Process Server 6.2 中引入了用于过程和人工任务的清理服务。在 WebSphere Process Server 管理控制台的 Business Flow Manager 的配置面板上可以找到过程清理服务的配置。

与过程实例相反,在操作量大的时间段删除任务实例不会严重影响系统性能,因为人工任务实例数据比过程实例数据少得多。WebSphere Process Server 6.2 也引入了任务删除服务,但是使用它的原因主要与功能相关,而不是与性能相关。与过程的清理服务相似,它的配置在 Human Task Manager 的配置面板上。在启用安全性时,要想执行清理服务,在 BPC 配置中必须指定 CleanupUser(在 Version 6.2 中)或 AdminJobUser(在 Version 7 中),指定的用户必须具有 BPC 系统管理员角色。

这些服务还有另一个必需的设置 —— 频率,必须用与 cron 相似的表达式指定频率。这决定服务开始运行的时间,而持续时间设置决定服务启动之后运行的最长时间。图 5 给出一个服务设置示例,这个服务在每晚 11 点运行,对于持续时间没有任何限制,这意味着它会一直运行到完成所有清理作业。

图 5. 清理服务配置面板
清理服务配置面板
清理服务配置面板

关于如何指定与 cron 相似的表达式,请参见 User Calendar 页面。

由于会在数据库系统产生很重的负载,同时用多个线程清理过程或任务实例是没有意义的。另外,如果两个线程同时删除过程或任务实例,会导致在日志中记录错误消息。尽管这不会导致功能性问题,但是会减慢清理过程。这意味着频率和持续时间的设置应该确保一个清理过程的结束时间和另一个清理过程的启动时间之间没有重叠。例如,对于持续时间为 120 分钟的服务,指定每小时运行一次就会导致以上问题。

对清理性能影响最大的参数是事务片(transaction slice)的大小。这个设置决定在一个事务中删除多少个过程实例。默认值是 10。

增加事务片的大小会提高性能。但是,必须考虑到在不出现事务超时或事务日志写满的情况下数据库能够处理的操作量。包含大量活动和相关数据的过程需要更小的事务片。需要用将要删除的最大过程进行测试,从而确定这个参数的最佳设置。每个事务片删除 20 个过程实例常常可以轻松地完成。如果过程有 100 个或更多活动,那么将值设置为 50 可能太多了。

其他参数(比如 delete older than 或 process end states)对删除过程或任务的性能没有影响。

清理作业的定义决定在运行清理服务时删除哪些过程实例。对于每个过程模板,可以指定删除处于特定结束状态的过程,还可以指定删除之前处于此状态的最小时间。必须定义至少一个清理作业;否则,清理服务不会删除任何过程。

图 6 为模板 A 创建一个清理作业,它在实例到达结束状态之后立即删除它们。如果要对多个模板应用相同的设置,可以指定一个以逗号分隔的模板名列表。

图 6. 清理作业的配置
清理作业的配置
清理作业的配置

作业的序号决定执行次序。如果为清理服务指定的最大持续时间太低,那么列表末尾的作业可能根本不会执行。图 7 给出一个清理作业列表。在这里,先删除模板 A 的所有过程,然后删除模板 B 或 C 的过程。

图 7. 已配置的清理作业列表
已配置的清理作业列表
已配置的清理作业列表

使用 BPC Explorer 删除实例

管理员可能需要检查某些业务过程实例,比如出现了处于 failed 状态的实例,或者某些实例必须由管理员终止。

可以使用 BPC Explorer 执行这些操作。在处理这些实例时,可能必须删除实例。BPC Explorer 在 “Process Instances Administered By Me” 视图(图 8)或 “Process Instance Details” 视图中提供删除实例的选项。

图 8. 使用 BPC Explorer 删除业务过程实例
使用 BPC Explorer 删除业务过程实例
使用 BPC Explorer 删除业务过程实例

这种方法也适用于任务实例。另外,可以通过定义定制的视图简便地选择要删除的实例。

BPC Explorer 在它自己的事务中删除每个过程或任务实例。

使用 API 函数删除实例

BPC 提供用来查询和删除过程和任务实例的函数。这些函数可以在所有 API 风格中使用,包括通过 EJB、JMS、REST 或 Web 服务 API。

BPC Samples 页面和 WebSphere Process Server Information Center 讨论了这些 API 的使用方法,是寻找相关信息的好地方。更多信息见 参考资料

删除相关数据

对于过程实例和人工任务,可以在 BPC 数据库或单独的数据库中存储相关数据,这些数据也需要清理。这些数据包括:

  • 审计日志条目
  • 为 BPC 报告功能存储的事件
  • 人员查询

删除审计日志条目

对于业务过程和人工任务,可以把事件发送到 BPC 数据库中特定的审计日志表。可以使用这些数据跟踪过程历史,满足审计和报告需求。

要想为事件启用这个功能,业务过程和人工任务需要有审计日志目的地。这在过程或任务模型中设置,见图 9。

图 9. 在 WebSphere Integration Developer 中为业务过程启用审计日志
在 WebSphere Integration Developer 中为业务过程启用审计日志
在 WebSphere Integration Developer 中为业务过程启用审计日志

我们建议把这些审计表放在单独的表空间中,定期使用一般的数据库方法存档这些数据。存档之后,从审计日志表中删除老的条目。这可以使用通用的数据库机制来完成。对于业务过程审计条目,可以使用 deleteAuditLog.py 脚本根据特定的条件从 Business Flow Manager Audit 表中删除。这个脚本不适用于单独人工任务的审计条目。

关于这个脚本的更多信息请参见 Deleting audit log entries, using administrative scripts

删除报告功能事件

BPC Explorer 提供了显示业务过程实例历史的选项。这个报告功能需要单独配置,它使用过程实例发出的 CEI 事件。

这些事件存储在 BPC Explorer 的报告功能数据库中。在过程实例到达结束状态之后,可以使用 observerDeleteProcessInstanceData.py 脚本从这些表中删除数据。

关于这个脚本的更多信息,参见 Deleting data from the reporting database

刷新人员查询结果并删除不使用的人员查询结果

与过程和任务的清理服务相似,有一个刷新人员查询的服务。这个服务用于把人工任务分配给特定的人员。经过解析的人员查询缓存在 BPEDB 中,但是公司中的人员可能会有变动。

因此,缓存的人员查询可能会过期。在默认情况下,过期时间设置为一小时。但是,即使人员查询过期了,如果不运行刷新服务或执行 refreshStaffQuery.py 脚本,就仍然使用缓存的人员查询。这种行为与 V6.0.x 之前的版本不同。过去,人员查询在过期之后会马上刷新。

在默认情况下,刷新人员查询服务安排在每天凌晨 1 点运行。这个设置对于大多数人工任务场景是合理的,因为 24 小时内常常是发生人员变动的时间段。在某些情况下,最佳时间长度可能不一样。但是,根据人员分配的性质,数据库上的刷新操作可能占用大量资源。在修改这个服务的运行频率时,要确保人员分配是最新的,并且要考虑到刷新对性能的影响。可以在管理控制台的 Human Task Manager 配置面板上修改频率和过期时间。

人员查询结果缓存在 BPEDB 中。在某些情况下,人员查询结果不会自动地删除。清理这些不使用的人员查询结果会对系统性能产生积极影响。WebSphere Process Server 提供的 cleanupUnusedStaffQueryInstances.py 脚本可以执行这个操作。

结束语

本文讨论了从 Business Process Choreographer 数据库中删除过程和任务实例的各种方法。这些方法分为两类:在过程或任务模型中包含自动删除设置,或者通过管理操作应用推迟的或调度的实例删除机制。选用的方法取决于 WebSphere Process Server 应用程序的响应时间需求,以及是否有系统利用率低的时间段,可以用来执行推迟的删除操作。实例的删除常常与存档操作相关联。本系列后续的一篇文章将详细讨论存档。

本文是讨论 WebSphere Process Server 操作的系列文章之一。第 1 部分 介绍 WebSphere Process Server 系统管理的基本任务和正常作业环境的操作,包括各种方式和工具。第 3 部分 讨论 BPEDB 的数据库级维护。本系列中的后续文章将讨论应用程序管理、监视和修复或存档方法等主题。

致谢

作者要感谢 Geoffrey Beers、Thomas Bernhardt、Suresh Bhat、Gabriel Dermler、Erich Fussi、Jonas Grundler、Uma Rao 和 Andre Weiser 审阅本文并提供宝贵意见。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=478072
ArticleTitle=操作 WebSphere Process Server 环境,第 2 部分: 维护最佳 Business Process Choreographer 数据库大小的方法
publish-date=03292010