Sun Java System Message Queue 3.7 UR1 技术概述

组件服务

图 3–1 显示 Message Queue 服务。第 2 章,客户端编程模型介绍编程模型以及客户端如何使用 Java 和 C API 与客户端运行时环境进行交互。客户端运行时环境是客户端应用程序可以访问的消息服务的一部分。本章重点介绍管理员可以访问的消息服务的组件和服务。

图 3–1 Message Queue 服务

Message Queue 服务的组件。对象存储库、客户端、客户端运行时、代理、管理控制台。图采用文本进行说明。

可通过设置代理属性来控制 Message Queue 服务。这些属性可分为多个类别,具体取决于受特定属性影响的服务或代理组件。代理服务包括:

以下各节将介绍上述每个服务,并概述根据您的特定需要自定义该服务时所使用的属性。

代理属性在不同的配置文件中定义,还可以在用来启动代理的命令行上定义。《Sun Java System Message Queue 3.7 UR1 管理指南》中的第 4  章 “配置代理”介绍了这些配置文件,并解释优先级顺序。通过该顺序,可以确定是否可以用一个文件中的属性值覆盖另一个文件中设置的值。使用启动命令设置的属性可以覆盖其他所有设置。

连接服务

使用与连接有关的属性,可以配置和管理代理与客户端之间的物理连接。Message Queue 客户端使用的连接服务将在连接到代理中进行介绍,该节介绍了可用的连接服务,包括它们的名称、类型和底层协议。连接服务是多线程的,并可以通过专用端口使用。专用端口可以由代理的端口映射器动态分配,也可以由管理员静态分配。默认情况下,当启动代理时,会启动并运行 jmsadmin 服务。

因为每个连接都存在两方,所以连接配置会发生在每一方并需要协调:

客户端可以通过防火墙连接到 Message Queue 服务。这可以通过以下方法来完成:让防火墙管理员打开特定的端口,然后连接到该(静态)端口,或者如附录 B,Message Queue 功能 中总结的那样使用 HTTP 或 HTTPS 服务。

每个连接服务还支持特定的验证和授权功能。有关详细信息,请参见安全服务

端口映射器

驻留在代理主端口 7676 的通用端口映射器会为连接服务动态分配一个端口。Message Queue 客户端运行时环境在建立与代理的连接时,会首先与该端口映射器联系,为它已选定的连接服务请求端口号。

配置 jmsssljmsadminssladmin 连接服务时,也可以通过为这些服务分配静态端口号来代替端口映射器的动态分配。但是,通常仅在特殊情况下(如,通过防火墙建立连接时)才使用静态端口,一般不建议使用静态端口。

线程池管理

每个连接服务都是多线程的,因此可以支持多个连接。这些连接所需的线程由线程池中的代理来维护。它们的分配方式取决于您指定的最小和最大线程值以及您选择的线程处理模型。

可以设置用来指定最小和最大线程数的代理属性。因为线程是连接所必需的,所以它们将添加到支持该连接的服务的线程池中。最小值指定可供分配的线程的数量。当可用线程超过这个最小阈值时,系统将在线程变为空闲状态时关闭这些线程,直到再次达到最小阈值,以此来节省内存资源。如果负载较重,线程数可能会增加,直到达到线程池的最大数量。此后,新的连接将被拒绝,直到某个线程变得可用。

所选的线程模型可指定线程是专用于单个连接还是由多个连接共享:

目的地和路由服务

客户端连接到代理之后,即可开始路由和传送消息。在该阶段,代理负责创建和管理不同类型的物理目的地、确保消息顺利流动以及高效使用资源。代理使用与路由和目的地有关的代理属性,按照符合应用程序需要的方式来管理这些任务。

请记住,代理的物理目的地是一个内存位置,消息在传送到消息使用方之前存储在该位置。物理目的地分为四种:

管理目的地

可以使用 imqcmd 实用程序来管理目的地。要管理目的地,需要完成下面的一个或多个任务:

管理任务因所管理的目的地的种类(管理员创建、自动创建、临时或停用消息队列)而异。例如,临时目的地不需要显式销毁;自动创建的属性可通过使用某些代理配置属性来配置,这些属性应用于该代理中自动创建的所有目的地。

配置物理目的地

为了获得最佳性能,您可以在创建或更新物理目的地时设置属性。下面是可以设置的属性:

对于队列目的地,还可以配置备份使用方的最大数量,并为群集代理指定是否优先传送到本地队列。

还可以配置停用消息队列的限制和行为。但是,请注意,停用消息队列的默认属性不同于标准队列的属性。

管理内存

因为目的地可能使用大量的资源(取决于它们处理的消息的数量和大小以及注册的使用方数量和长期性),所以需要对它们进行严格的管理,以保证消息传送服务具有良好的性能和可靠性。

可以设置一些属性,以防止向代理传入过多的消息并防止代理内存不足。代理使用以下三级内存保护,使消息服务在资源不足时仍可正常运行:目的地限制、系统范围限制以及系统内存阈值。理想情况下,如果目的地限制和系统范围限制设置得当,则应当不会达到紧急系统内存阈值。

目的地消息限制

可以设置用来管理每个目的地的内存和消息流的目的地属性。例如,可指定目的地允许的生成方的最大数量、目的地允许的消息的最大数量或最大大小以及任何一条消息的最大大小。

还可以指定在达到上述任何限制时代理的响应方式:降低生成方的速度、丢弃最旧的消息、丢弃优先级最低的消息或者拒绝最新的消息。

系统范围消息限制

还可以使用属性来设置应用于代理中所有目的地的限制:可以指定消息总数和所有消息占用的内存。如果达到了任何系统范围消息限制,代理将拒绝新消息。

系统内存阈值

最后,可以使用属性来设置阈值。当达到阈值时,代理会采取越来越严格的措施来防止内存过载。采取的操作取决于内存资源的状态:green(可用内存充足)、yellow(代理内存不足)、orange(代理内存严重不足)、red(代理无可用内存)。随着代理的内存状态从 green 变为 red,代理所采取的措施也会越来越严格:

持久性服务

代理在发生故障后进行恢复时,需要重新创建消息传送操作的状态。为此,它必须将状态信息保存到数据存储库。代理重新启动时,会使用所保存的数据来重新创建目的地和长期订阅、恢复持久性消息、回滚打开的事务以及为未传送的消息重新创建路由表。然后代理才能恢复消息传送

Message Queue 服务既支持基于文件的持久性模块,又支持符合 JDBC 的持久性模块(请参见图 3–2)。默认情况下它使用基于文件的持久性。

图 3–2 持久性支持

该图显示代理使用平面文件 (flat file) 存储或符合 JDBC 的数据存储来保持消息。

基于文件的持久性

基于文件的持久性是一种使用单个的文件来存储持久性数据的机制。如果您使用基于文件的持久性,则可以设置用来执行以下操作的代理属性:

通常,基于文件的持久性比基于 JDBC 的持久性速度快,但是某些用户更希望获得符合 JDBC 的存储所提供的冗余和管理控制。

基于 JDBC 的持久性

基于 JDBC 的持久性使用 Java 数据库连接 (Java Database Connectivity, JDBCTM) 接口将代理连接到符合 JDBC 的数据存储库。为了让代理通过 JDBC 驱动程序来访问数据存储库,必须执行以下操作:

《Sun Java System Message Queue 3.7 UR1 管理指南》中的第 4  章 “配置代理”详细说明了完成这些任务及相关配置属性的完整步骤。

安全服务

Message Queue 服务对每个代理实例均支持验证和授权(访问控制)功能,同时还支持加密功能:

验证和授权功能依赖于包含消息传送系统的用户信息(用户名、密码和成员资格)的系统信息库。此外,要授予用户或组执行特定操作的权限,代理必须检查访问控制属性文件,该文件指定用户或组可以执行的操作。您需要设置某些信息,代理需要这些信息来验证用户并授予执行相应操作的权限。

图 3–3 显示代理为提供验证和授权功能所需的组件。

图 3–3 安全性管理器支持

安全性管理器既使用用户系统信息库,也使用访问控制属性文件。图采用文本进行说明。

图 3–3 所示,您可以将用户数据存储在随 Message Queue 服务提供的平面文件用户系统信息库中,也可以将它插入已有的 LDAP 系统信息库中。设置一个用来指示您所进行的选择的代理属性。

验证和授权

当客户端请求连接时,必须提供用户名和密码。代理会将指定的名称和密码与存储在用户系统信息库中的名称和密码进行比较。密码在从客户端传送到代理的过程中,将使用 Base 64 编码或消息摘要 (MD5) 散列进行编码。MD5 是适用于平面文件系统信息库;Base 64 是 LDAP 系统信息库所必需的。如果您使用的是 LDAP,则可能希望使用安全的 TLS 协议。通过设置一些代理属性,可以分别配置每个连接服务使用的编码类型,也可以设置适用于整个代理的编码方式。

当用户尝试执行某个操作时,代理将对照访问控制属性文件中指定的允许执行该操作的用户名和组成员资格,来检查用户系统信息库中该用户的用户名和组成员资格。访问控制属性文件为用户或组指定了执行以下操作的权限:

可以设置用来指定以下信息的代理属性:

加密

要对客户端与代理之间发送的消息进行加密,需要使用基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务。 通过在启用 SSL 的代理与启用 SSL 的客户端之间建立加密连接来提供连接级别的安全性。

可以设置一些代理属性,以指定要使用的 SSL 密钥库的安全属性以及密码文件的名称和位置。

监视服务

代理中包含一些用于监视和诊断应用程序及代理性能的组件。其中包括:

图 3–4 中显示的是通用方案。

图 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 管理指南》中的“编写应用程序来监视代理”