WebSphere Process Server (下文中以 WPS 表示)和 WebSphere ESB (下文中以 WESB 表示)使用内嵌的服务集成总线 Service Integration Bus (SIBus) 来支持组件间的异步通信。 SIBus 实际上是一个基于 Java Message Service (JMS) 规范的消息中间件,在实现过程中,缺省是有一个目的地 (Destination) (例如一个队列)唯一的分配给一个总线成员。在消息传输过程中,必须对目的地定义持久存储区,来保存消息的内容;同时也需要一个组件来保存数据并在需要时从持久存储区获取数据,而消息引擎就是实现该功能的组件。 在本系列的第一篇文章中,概要的介绍了对 WPS 性能产生影响的一些主要参数,本文将基于消息引擎特有的参数,详细介绍 WPS 消息引擎性能优化的方法和步骤,包括以下四部分:
选择消息数据持久化方式
设置数据缓冲区大小
配置环境实现消息引擎的故障转移
将消息引擎数据存储器迁移到更高性能的数据库
您可以参考本文,根据性能需求对 WPS 中的消息引擎进行调整优化。
对于消息数据进行持久化存储的方式有两种 – 使用文件存储器和使用数据存储器。文件存储是由操作系统完成的,它将操作信息和消息持久化到文件系统中。而数据存储一般指的是通过数据库,比如 WPS 默认使用的本地的 Derby 数据库来存储消息数据。
一般来说,消息引擎的持久化是通过数据存储实现的,在集群环境中更是如此。但文件存储器由于文件读写速度快,执行的速度也比本地的 Derby 数据库要快,因此可以提供比较高的存储性能。所以如果您使用的是用于开发或测试用途的单机 (standalone) WPS 或者 WESB 6.2.0 版本的服务器,您可以考虑通过文件系统实现 BPC 和 SCA 总线的持久化存储;但在集群环境,尤其是生产系统中,还是推荐使用更高性能的数据存储器(例如 DB2,Informix 或者 Oracle 等)来持久化消息数据。
当您决定以文件存储器方式实现消息引擎持久化时,您必须在创建概要文件的时候就进行配置。具体步骤如下所示:
1. 用概要文件管理工具创建一个新的单机 WESB 或 WPS 概要文件时,请选择概要文件创建选项 -> 创建高级概要文件,如图 1 所示:
2. 在数据库配置页面,选择”使用用于消息传递引擎 (ME) 的文件存储库”选项,如图 2 所示:
3. 当该概要文件创建成功之后,BPC 和 SCA 消息传递引擎就会使用文件存储器实现消息持久化,而 CEI 消息传递引擎仍将使用本地的 Derby Embedded 数据库作为存储器。
消息的可靠性对于任何消息传递系统来说都是一个非常重要的因素。在 WPS 中, JMS 消息具有服务质量属性,您可以通过这个属性来指定消息传递的可靠性级别。在配置可靠性级别时,您需要全面考虑对于可靠消息传递以及系统性能的需求,因为消息传递的速度和可靠性是此消彼长的。例如,如果您希望在任何情况下传递消息,那么可以将消息设置有保证持久类型的,但此种消息的传递速度也是最慢的。您可以在创建总线目的地 (bus destination) 时指定消息可靠性,您可以参照参考资料 1 中的步骤设置。
在 WPS 和 WESB 中,您可以对消息指定下列五种可靠性选项(也称为传递选项)。这些选项按可靠性递增顺序如下表 1 所示:
表 1. 消息服务可靠性级别列表
消息类型 |
可靠级别描述 |
最大努力非持久 |
当消息传递引擎停止或发生故障时,将废弃该消息。如果用于发送消息的连接变为不可用状态时,或者当系统资源不足时,也可能会废弃消息。 |
快速非持久 |
当消息传递引擎停止或发生故障时,将废弃该消息。如果用于发送消息的连接变为不可用状态时,也可能会废弃消息。 |
可靠非持久 |
当消息传递引擎停止或发生故障时,将废弃该消息。 |
可靠持久 |
当消息传递引擎发生故障时,可能会废弃消息。 |
有保证持久 |
不废弃消息。 |
持久化的消息始终会保存到某种形式的持久化数据暂存器中(比如上文提到的文件存储器或数据存储器),而非持久化消息通常存储在内存中。将消息存入磁盘或者数据存储器进行持久化的频率将影响系统的性能。对于最大努力非持久类型的消息来说,系统永远不会将它们存入磁盘或者数据存储器中;对于快速非持久和可靠非持久消息来说,只有当系统资源耗尽时才会将它们存入磁盘或者数据存储器;而对于可靠持久以及有保证持久消息而言,系统永远都会将它们存入磁盘或者数据存储器里。可靠持久消息和有保证持久消息的区别在于,可靠持久消息的持久化是异步的,而有保证持久消息的持久化是同步的。如果消息引擎在异步存储可靠持久性消息完成之前就停止了,则可能会造成该消息的丢失。
下面介绍的两个变量可以控制内存中数据缓冲区的类型和大小,用于在内存中保存上述五种类型的消息。数据缓冲区有固定的大小,而缺省值可能无法满足某些密集消息传输应用的需求,您可以根据自己的需要进行配置。
DiscardableDataBufferSize 变量定义了储存最大努力非持久性消息的数据缓冲区的大小,以字节为单位。最大努力非持久性消息的服务质量决定了消息数据不会被存入数据存储器中,并且当消息的容量过大溢出了数据缓冲器的大小时,该条消息将被丢弃。此变量缺省的大小是 320000 字节。当消息传递引擎将数据添加至此缓冲区时,例如,当消息传递引擎从客户机接收到最大努力非持久消息时,消息传递引擎可能会废弃缓冲区中已包含的数据以便腾出空间。此行为使消息传递引擎能够废弃最大努力非持久消息。
而 CachedDataBufferSize 变量指定了储存除最大努力非持久性消息之外其它四种类型消息的数据缓冲器大小,以字节为单位,此变量的大小缺省值也为 320000 字节。此数据缓冲区包含服务质量属性优于”最大努力非持久”的数据和存放在数据存储器中的数据。高速缓存数据缓冲区的用途是通过将消息传递引擎本来需要从数据存储器中读取的数据高速缓存在内存中来提高消息传递引擎的性能。当它将数据写至数据存储器以及从数据存储器中读取数据时,消息传递引擎会尝试将该数据添加至高速缓存数据缓冲区。消息传递引擎可能会废弃缓冲区中已包含的数据以便腾出空间。
您需要根据自身的需求设置这两种缓冲器的大小。您可以在管理控制台 -> 服务集成 -> 总线 -> 总线名称 -> 消息传递引擎 -> 消息引擎名 -> 其他属性 -> 定制属性中对每一个消息引擎进行设置,如图 3 所示,设置一个名称为 sib.msgstore.discardableDataBufferSize 的变量并定义它的大小为 40000000:
图 3. 设置 DiscardableDataBufferSize
和名为 sib.msgstore.cachedDataBufferSize 的变量并定义它的大小为 10000000,如图 4 所示:
上面图例中给出的建议值可以在消息大小为 1KB 的应用程序环境中达到较好的性能。如果您的应用环境中消息数据更大,则需要相应的调高上述两个缓冲区的大小。
消息引擎在运行时,会通过 TCP/IP 方式与后台数据存储器相连,并通过消息引擎的 ME_UUID 以及 INC_UUID 对数据存储器中的 SIBOWNER 表锁定,保存为一行中的一对唯一标识。当消息引擎启动时,它使用可以确定唯一性的标识来获得并维护它的互斥锁定。当正在运行的消息引擎突然主动关闭连接时(网络故障或宕机),数据库方面不会主动探测连接状况,所以不会释放对 SIBOWNER 表上的互斥锁,导致其余服务器上的可用消息引擎无法获取对该表的互斥锁,以致于无法顺利启动。您可能会在消息引擎日志中看到如下清单 1 中所示的错误信息:
[3/9/09 18:07:54:327 CST] 00000086 SibMessage I [SCA.SYSTEM.widCell.Bus:default.AppTa rget.000-SCA.SYSTEM.widCell.Bus] CWSIS1538I: The messaging engine, ME_UUID=2025B17928C161D 6, INC_UUID=303A303AEAB3EDD7, is attempting to obtain an exclusive lock on the data store. [3/9/09 18:07:59:343 CST] 00000086 SibMessage I [SCA.SYSTEM.widCell.Bus:default.AppTa rget.000-SCA.SYSTEM.widCell.Bus] CWSIS1546I: The messaging engine, ME_UUID=2025B17928C161D 6, INC_UUID=303A303AEAB3EDD7, has lost an existing lock or failed to gain an initial lock on the data store. [3/9/09 18:08:04:227 CST] 00000086 SibMessage I [SCA.APPLICATION.widCell.Bus:default. AppTarget.000-SCA.APPLICATION.widCell.Bus] CWSIS1538I: The messaging engine, ME_UUID=F1FF9 3EDD8DCD63B, INC_UUID=7CF47CF484B974F5, is attempting to obtain an exclusive lock on the data store. [3/9/09 18:08:09:329 CST] 00000086 SibMessage I [SCA.APPLICATION.widCell.Bus:default. AppTarget.000-SCA.APPLICATION.widCell.Bus] CWSIS1546I: The messaging engine, ME_UUID=F1FF9 3EDD8DCD63B, INC_UUID=7CF47CF484B974F5, has lost an existing lock or failed to gain an initial lock on the data store. [3/9/09 18:08:11:237 CST] 00000086 SibMessage I [CommonEventInfrastructure_Bus:defaul t.AppTarget.000-CommonEventInfrastructure_Bus] CWSIS1538I: The messaging engine, ME_UUID=D 65CBBE3A63BDFD6, INC_UUID=6FAA6FAA85818EDB, is attempting to obtain an exclusive lock on the data store. [3/9/09 18:08:14:465 CST] 00000086 SibMessage I [CommonEventInfrastructure_Bus:defaul t.AppTarget.000-CommonEventInfrastructure_Bus] CWSIS1546I: The messaging engine, ME_UUID=D 65CBBE3A63BDFD6, INC_UUID=6FAA6FAA85818EDB, has lost an existing lock or failed to gain an initial lock on the data store. [3/9/09 18:08:18:398 CST] 00000086 SibMessage I [BPC.widCell.Bus:default.AppTarget.00 0-BPC.widCell.Bus] CWSIS1538I: The messaging engine, ME_UUID=B5290700DB25A3BE, INC_UUID=14 96149685818EF1, is attempting to obtain an exclusive lock on the data store. [3/9/09 18:08:19:144 CST] 00000086 SibMessage I [BPC.widCell.Bus:default.AppTarget.00 0-BPC.widCell.Bus] CWSIS1546I: The messaging engine, ME_UUID=B5290700DB25A3BE, INC_UUID=14 96149685818EF1, has lost an existing lock or failed to gain an initial lock on the data store.
|
以下文章点击率最高
Loading…