Message Queue 客户端性能取决于客户端设计以及 Message Queue 服务的配置和管理方式。本章将更详细地讲述第 1 章中介绍的 Message Queue 服务。同时本章还列出该服务的组件,介绍配置这些组件所用的工具,并概述在不同环境中管理消息服务所需的任务。本章包含以下各节:
图 3–1 显示 Message Queue 服务。第 2 章,客户端编程模型介绍编程模型以及客户端如何使用 Java 和 C API 与客户端运行时环境进行交互。客户端运行时环境是客户端应用程序可以访问的消息服务的一部分。本章重点介绍管理员可以访问的消息服务的组件和服务。
可通过设置代理属性来控制 Message Queue 服务。这些属性可分为多个类别,具体取决于受特定属性影响的服务或代理组件。代理服务包括:
以下各节将介绍上述每个服务,并概述根据您的特定需要自定义该服务时所使用的属性。
代理属性在不同的配置文件中定义,还可以在用来启动代理的命令行上定义。《Sun Java System Message Queue 3.7 UR1 管理指南》中的第 4 章 “配置代理”介绍了这些配置文件,并解释优先级顺序。通过该顺序,可以确定是否可以用一个文件中的属性值覆盖另一个文件中设置的值。使用启动命令设置的属性可以覆盖其他所有设置。
使用与连接有关的属性,可以配置和管理代理与客户端之间的物理连接。Message Queue 客户端使用的连接服务将在连接到代理中进行介绍,该节介绍了可用的连接服务,包括它们的名称、类型和底层协议。连接服务是多线程的,并可以通过专用端口使用。专用端口可以由代理的端口映射器动态分配,也可以由管理员静态分配。默认情况下,当启动代理时,会启动并运行 jms 和 admin 服务。
因为每个连接都存在两方,所以连接配置会发生在每一方并需要协调:
客户端必须配置连接工厂对象的某些属性才能执行以下操作:请求非默认的连接服务、主机和端口;指定在需要重新连接到另一个代理时可连接到的代理的列表;配置重新连接行为。客户端还可以指定测试失败连接的 ping 间隔。
而管理员可以使用代理属性来执行以下操作:激活非默认的连接服务;根据需要分配静态端口;配置线程处理;在使用多个网卡时指定要连接到的主机。管理员还可以指定测试客户端是否可以访问的 ping 间隔,这对于管理资源非常有用。
客户端可以通过防火墙连接到 Message Queue 服务。这可以通过以下方法来完成:让防火墙管理员打开特定的端口,然后连接到该(静态)端口,或者如附录 B,Message Queue 功能 中总结的那样使用 HTTP 或 HTTPS 服务。
每个连接服务还支持特定的验证和授权功能。有关详细信息,请参见安全服务。
驻留在代理主端口 7676 的通用端口映射器会为连接服务动态分配一个端口。Message Queue 客户端运行时环境在建立与代理的连接时,会首先与该端口映射器联系,为它已选定的连接服务请求端口号。
在配置 jms、ssljms、admin 和 ssladmin 连接服务时,也可以通过为这些服务分配静态端口号来代替端口映射器的动态分配。但是,通常仅在特殊情况下(如,通过防火墙建立连接时)才使用静态端口,一般不建议使用静态端口。
每个连接服务都是多线程的,因此可以支持多个连接。这些连接所需的线程由线程池中的代理来维护。它们的分配方式取决于您指定的最小和最大线程值以及您选择的线程处理模型。
可以设置用来指定最小和最大线程数的代理属性。因为线程是连接所必需的,所以它们将添加到支持该连接的服务的线程池中。最小值指定可供分配的线程的数量。当可用线程超过这个最小阈值时,系统将在线程变为空闲状态时关闭这些线程,直到再次达到最小阈值,以此来节省内存资源。如果负载较重,线程数可能会增加,直到达到线程池的最大数量。此后,新的连接将被拒绝,直到某个线程变得可用。
所选的线程模型可指定线程是专用于单个连接还是由多个连接共享:
在专用模型中,与代理的每个连接都需要两个线程:一个用于传入消息,另一个用于传出消息。这限制了可能的连接数量,但提高了性能。
在共享模型中,当发送或接收消息时,连接由共享线程处理。由于每个连接都不需要专用线程,因此,该模型增加了可能的连接数量,但同时也增加了线程管理开销,从而会影响性能。
客户端连接到代理之后,即可开始路由和传送消息。在该阶段,代理负责创建和管理不同类型的物理目的地、确保消息顺利流动以及高效使用资源。代理使用与路由和目的地有关的代理属性,按照符合应用程序需要的方式来管理这些任务。
请记住,代理的物理目的地是一个内存位置,消息在传送到消息使用方之前存储在该位置。物理目的地分为四种:
管理员创建的目的地,由管理员使用 GUI (imqadmin) 或 imqcmd 实用程序创建。这些目的地对应于以编程方式创建的逻辑目的地,或者对应于由管理员创建、由客户端查找的目的地受管理对象。可以使用 imqcmd 实用程序来为管理员创建的每个目的地设置或更新属性。
自动创建的目的地,当消息使用方或生成方尝试访问不存在的目的地时,由代理自动创建的目的地。这些目的地通常在开发过程中使用。可以设置用来禁止创建此类目的地的代理属性。可以设置用来配置特定代理中所有自动创建的目的地的代理属性。
当自动创建的目的地不再使用时,也就是当它不再与任何消息使用方客户端连接且不再包含任何消息时,代理会自动将它销毁。如果代理重新启动,则只有当它包含持久性消息时,才会重新创建这种目的地。
临时目的地,由需要一个用来接收消息回复的目的地的客户端以编程方式显式创建和销毁。顾名思义,这些目的地是为连接临时创建的,并由代理维护,而且仅在连接期间存在。
临时目的地不永久存储,并且绝不会在代理重新启动时重新创建,但是它们对于管理工具是可见的。
停用消息队列是一种在代理启动时自动创建的专用目的地,用于存储停用消息,以便于进行诊断。可以使用 imqcmd 实用程序为停用消息队列设置属性。
可以使用 imqcmd 实用程序来管理目的地。要管理目的地,需要完成下面的一个或多个任务:
创建、暂停、继续或销毁目的地
列出代理中的所有目的地
显示有关目的地的状态和属性的信息
显示目的地的度量信息
压缩用于持久保留目的地消息的磁盘空间
更新物理目的地的属性
管理任务因所管理的目的地的种类(管理员创建、自动创建、临时或停用消息队列)而异。例如,临时目的地不需要显式销毁;自动创建的属性可通过使用某些代理配置属性来配置,这些属性应用于该代理中自动创建的所有目的地。
为了获得最佳性能,您可以在创建或更新物理目的地时设置属性。下面是可以设置的属性:
目的地的类型和名称。
目的地的单个和合计限制(消息的最大数量、最大总字节数、每条消息的最大字节数以及生成方的最大数量)。
在超过单个或合计限制时,代理应当执行的操作。
要在一批中传送的消息的最大数量。
是否应将目的地的停用消息发送到停用消息队列。
对于群集代理,是否应当将目的地复制到群集内的其他代理。
对于队列目的地,还可以配置备份使用方的最大数量,并为群集代理指定是否优先传送到本地队列。
还可以配置停用消息队列的限制和行为。但是,请注意,停用消息队列的默认属性不同于标准队列的属性。
因为目的地可能使用大量的资源(取决于它们处理的消息的数量和大小以及注册的使用方数量和长期性),所以需要对它们进行严格的管理,以保证消息传送服务具有良好的性能和可靠性。
可以设置一些属性,以防止向代理传入过多的消息并防止代理内存不足。代理使用以下三级内存保护,使消息服务在资源不足时仍可正常运行:目的地限制、系统范围限制以及系统内存阈值。理想情况下,如果目的地限制和系统范围限制设置得当,则应当不会达到紧急系统内存阈值。
可以设置用来管理每个目的地的内存和消息流的目的地属性。例如,可指定目的地允许的生成方的最大数量、目的地允许的消息的最大数量或最大大小以及任何一条消息的最大大小。
还可以指定在达到上述任何限制时代理的响应方式:降低生成方的速度、丢弃最旧的消息、丢弃优先级最低的消息或者拒绝最新的消息。
还可以使用属性来设置应用于代理中所有目的地的限制:可以指定消息总数和所有消息占用的内存。如果达到了任何系统范围消息限制,代理将拒绝新消息。
最后,可以使用属性来设置阈值。当达到阈值时,代理会采取越来越严格的措施来防止内存过载。采取的操作取决于内存资源的状态:green(可用内存充足)、yellow(代理内存不足)、orange(代理内存严重不足)、red(代理无可用内存)。随着代理的内存状态从 green 变为 red,代理所采取的措施也会越来越严格:
它丢弃持久性消息在数据存储库中的内存副本。
它限制生成方的非持久性消息,最终会停止进入代理的消息流。持久性消息流自动受以下要求的限制:每条消息必须由代理确认。
代理在发生故障后进行恢复时,需要重新创建消息传送操作的状态。为此,它必须将状态信息保存到数据存储库。代理重新启动时,会使用所保存的数据来重新创建目的地和长期订阅、恢复持久性消息、回滚打开的事务以及为未传送的消息重新创建路由表。然后代理才能恢复消息传送。
Message Queue 服务既支持基于文件的持久性模块,又支持符合 JDBC 的持久性模块(请参见图 3–2)。默认情况下它使用基于文件的持久性。
基于文件的持久性是一种使用单个的文件来存储持久性数据的机制。如果您使用基于文件的持久性,则可以设置用来执行以下操作的代理属性:
压缩数据存储库以减少添加和删除消息所产生的碎片。
在每次写入时与物理存储器同步内存中的状态。这有助于避免因系统崩溃而导致的数据丢失。
管理数据存储文件的消息分配以及进行文件管理和存储所需的资源。
通常,基于文件的持久性比基于 JDBC 的持久性速度快,但是某些用户更希望获得符合 JDBC 的存储所提供的冗余和管理控制。
基于 JDBC 的持久性使用 Java 数据库连接 (Java Database Connectivity, JDBCTM) 接口将代理连接到符合 JDBC 的数据存储库。为了让代理通过 JDBC 驱动程序来访问数据存储库,必须执行以下操作:
设置与 JDBC 有关的代理配置属性。使用这些属性可以指定使用的 JDBC 驱动程序、将代理作为 JDBC 用户来验证、创建需要的表格等。
使用 imqdbmgr 实用程序可以创建具有正确模式的数据存储库。
《Sun Java System Message Queue 3.7 UR1 管理指南》中的第 4 章 “配置代理”详细说明了完成这些任务及相关配置属性的完整步骤。
Message Queue 服务对每个代理实例均支持验证和授权(访问控制)功能,同时还支持加密功能:
验证功能确保只有通过验证的用户才能与代理建立连接。
授权指定哪些用户或组具有访问资源以及执行特定操作的权限。
加密功能防止消息在通过连接传送时被篡改。
验证和授权功能依赖于包含消息传送系统的用户信息(用户名、密码和组成员资格)的系统信息库。此外,要授予用户或组执行特定操作的权限,代理必须检查访问控制属性文件,该文件指定用户或组可以执行的操作。您需要设置某些信息,代理需要这些信息来验证用户并授予执行相应操作的权限。
图 3–3 显示代理为提供验证和授权功能所需的组件。
如图 3–3 所示,您可以将用户数据存储在随 Message Queue 服务提供的平面文件用户系统信息库中,也可以将它插入已有的 LDAP 系统信息库中。设置一个用来指示您所进行的选择的代理属性。
如果您希望使用现有的 LDAP 服务器,请使用 LDAP 供应商提供的工具来填充和管理用户系统信息库。还必须在代理实例配置文件中设置一些属性,以使代理能够在 LDAP 服务器中查询有关用户和组的信息。
如果可伸缩性非常重要,或者需要在不同的代理之间共享系统信息库,则最好选择 LDAP 选项。如果您使用的是代理群集,就可能会遇到这种情况。
当客户端请求连接时,必须提供用户名和密码。代理会将指定的名称和密码与存储在用户系统信息库中的名称和密码进行比较。密码在从客户端传送到代理的过程中,将使用 Base 64 编码或消息摘要 (MD5) 散列进行编码。MD5 是适用于平面文件系统信息库;Base 64 是 LDAP 系统信息库所必需的。如果您使用的是 LDAP,则可能希望使用安全的 TLS 协议。通过设置一些代理属性,可以分别配置每个连接服务使用的编码类型,也可以设置适用于整个代理的编码方式。
当用户尝试执行某个操作时,代理将对照访问控制属性文件中指定的允许执行该操作的用户名和组成员资格,来检查用户系统信息库中该用户的用户名和组成员资格。访问控制属性文件为用户或组指定了执行以下操作的权限:
连接到代理
访问目的地:创建任意给定目的地或所有目的地的使用方、生成方或队列浏览器
自动创建目的地
可以设置用来指定以下信息的代理属性:
要对客户端与代理之间发送的消息进行加密,需要使用基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务。 通过在启用 SSL 的代理与启用 SSL 的客户端之间建立加密连接来提供连接级别的安全性。
可以设置一些代理属性,以指定要使用的 SSL 密钥库的安全属性以及密码文件的名称和位置。
代理中包含一些用于监视和诊断应用程序及代理性能的组件。其中包括:
生成数据的组件,包括度量生成器和记录事件的代理代码。
将输出信息写入多个输出通道的记录程序组件。
度量消息生成方,将包含度量信息的 JMS 消息发送到主题目的地以供 JMS 监视客户端使用。
图 3–4 中显示的是通用方案。
度量生成器提供有关代理活动的信息,如流入流出代理的消息流、代理内存中的消息数及其使用的内存量、打开的连接数以及正在使用的线程数。
通过设置代理属性,可以启用和禁用度量数据的生成,以及指定度量报告的生成频率。
出错时,Message Queue 记录程序提取由代理代码和度量生成器生成的信息,并将这些信息写入标准输出(控制台)、日志文件以及(SolarisTM 平台上的)syslog 守护程序进程。
您可以设置一些代理属性,以指定记录程序收集的信息类型以及写入每个输出通道的类型。对于日志文件,还可以指定何时关闭日志文件并将输出转移到新文件。在日志文件达到指定的大小或生存期后,将保存该文件并创建一个新的日志文件。
有关如何配置记录程序以及如何使用它来获取性能信息的详细信息,请参见《Sun Java System Message Queue 3.7 UR1 管理指南》中的“配置和使用代理日志记录”。
图 3–4 所示的度量消息生成方按一定的时间间隔接收来自度量生成器的信息,并将这些信息写入消息,然后根据消息中包含的度量信息的类型,将消息发送至多个度量主题目的地之一。
订阅这些度量主题目的地的 Message Queue 客户端可以使用消息,并处理消息中包含的度量数据。这样,开发者就可以创建自定义监视工具来支持消息传送应用程序。有关每种类型的度量消息中报告的度量数量的详细信息,请参见《Sun Java System Message Queue 3.7 UR1 管理指南》中的第 18 章 “度量参考”。有关如何配置度量消息生成的信息,请参见《Sun Java System Message Queue 3.7 UR1 Developer’s Guide for Java Clients》中的第 4 章 “Using the Metrics Monitoring API”和《Sun Java System Message Queue 3.7 UR1 管理指南》中的“编写应用程序来监视代理”。
本节介绍用来配置 Message Queue 服务的工具以及为支持开发或生产环境而需要完成的任务。
图 3–5 显示不包括客户端连接的消息服务的视图,并突出显示代理组件和用来管理这些组件的工具。
可以使用以下命令行工具来配置和管理 Message Queue 服务。
可以使用 imqbrokerd 实用程序来启动代理。可以使用 imqbrokerd 命令的选项来指定是否应该连接群集中的代理以及指定其他启动配置信息。
可以使用 imqdbmgr 实用程序来创建和管理用于持久性存储的符合 JDBC 的数据库。(不需要从外部来管理内置的文件存储。)
基于 GUI 的管理控制台结合了 imqcmd 和 imqobjmgr 实用程序的某些功能。可以使用管理控制台来执行以下操作:
连接到代理并对它进行管理。
创建和管理物理目的地。
连接到对象存储库、向存储库添加对象并管理这些对象。
开发客户端组件时,最好尽量减少管理工作。Message Queue 产品的设计有助于实现此目标并且可以即装即用。只需启动代理就可使用。以下做法有助于您将重点放在开发上:
使用数据存储库(内置文件持久性)、用户系统信息库(基于文件)和访问控制属性文件的默认实现。这些对于开发测试已经足够了。默认的用户系统信息库是使用默认条目创建的,这些条目使您在安装代理之后可以立即使用它。可以使用默认用户名 (guest) 和密码 (guest) 来验证客户端。
通过创建一个用于该目的的目录来使用简单的文件系统对象存储库,并在其中存储受管理对象。如果您不希望创建存储,则还可以直接在代码中实例化受管理对象。
使用自动创建的物理目的地,而不是在代理中显式创建它们。有关信息,请参见相应的开发者指南。
在生产环境中,消息服务管理在应用程序性能以及满足企业对可伸缩性、可用性和安全性的要求等方面扮演着重要角色。在生产环境中,管理员还需要执行更多任务。这些任务大致可分为设置操作和维护操作。
通常,您必须执行以下设置操作:
安全的管理访问
无论您使用的是基于文件的用户系统信息库还是 LDAP 用户系统信息库,都需要确保管理员在 admin 组中并且拥有安全的密码。如有必要,请为管理员创建一个与代理的安全连接。
安全的客户端访问
无论您使用的是基于文件的用户系统信息库还是 LDAP 用户系统信息库,都需要使用可以访问消息服务的用户名来填充用户系统信息库,并编辑访问控制属性文件,以赋予用户相应的权限。如有必要,请设置基于 SSL 的连接服务。为了防止未经验证的连接,请确保更改 "guest" 用户的密码。
创建和配置物理目的地
设置目的地属性,以确保消息数量和为消息分配的内存量在代理资源支持的范围内。
创建和配置受管理对象。
如果您希望使用 LDAP 对象存储库,请配置并设置该存储库。创建和配置连接工厂和目的地受管理对象。
如果需要有状态的水平扩展,请创建一个代理群集。
创建一个中心配置文件并指定一个主代理。
要监视和控制代理资源并调整应用程序的性能,您必须在部署应用程序之后执行以下操作:
支持和管理应用程序客户端
监视和管理目的地、长期订阅以及事务
禁用自动创建功能
监视和管理停用消息队列
监视和调整代理
恢复出现故障的代理
监视、调整和重新配置代理
管理代理内存资源
根据需要扩展群集
管理受管理对象
根据需要创建其他受管理对象,并对连接工厂属性进行调整,以提高性能和吞吐量。
可以通过连接代理并允许它们共享状态信息来水平扩展 Message Queue 服务。这允许任何代理访问远程目的地并为更多的客户端提供服务。有关其他信息,请参见第 4 章,代理群集。